Copio un git repo en otro git repo, ¿cómo restaurarlo?

cp -a gitrepo1/ gitrepo2/ en Mac, parece que los files y .git/ incluyen .git/ se copyn en gitrepo2 /, ¿cómo puedo restaurar gitrepo2?

La acción de copy no debería haber sobrescrito los objects viejos; ese es el punto de los nombres de objects hash; ¡son únicos! Tal vez acabas de tener una twig principal, por lo que has sobrescrito la twig .git/refs/heads/master y tu file .git/HEAD . Eso solo significa que las confirmaciones que desea ya no forman parte de una cadena de compromisos referida. Eso significa que los compromisos que perdiste son inalcanzables. Podemos encontrar compromisos inalcanzables así:

 git fsck --unreachable | grep commits | cut -d' ' -3 

Eso debería proporcionarle una list de todas las confirmaciones que no están en el ancestro (inclusive) de una twig, o labeldas. Puedes hacer varias cosas en este punto. Por ejemplo, puedes unir todos estos elementos y enviarlos a gitk para visualizar el gráfico loco de todos ellos. Sin embargo, si solo tienes una única twig maestra, las cosas pueden ser bastante fáciles. Solo tenemos que tomar todas estas confirmaciones "perdidas", orderarlas por time de compromiso (el time del autor sería less útil si las confirmaciones se hubieran reorderado mediante selección selectiva o rebase) y ver las confirmaciones al final de la list:

 git fsck --unreachable | cut -d' ' -f3 | while read c; do git log -1 --format='%ct %H %s' $c; done | sort 

Esta será una mezcla de compromisos de dos repositorys, pero los posts deberían ayudar. Una vez que [con suerte] encuentre la cabeza anterior, obtenga su número hash y (suponiendo que esté en el maestro y desee restaurar el antiguo maestro al lugar que le corresponde):

 git reset --hard <hash> 

Eso debería hacerlo! No estoy 100% seguro de que git fsck --unreachable realmente muestra todos los commits (vale la pena escanear, aunque estén hablando de objects, no de commits). También está git fsck --full , que se supone que busca commits sin padres, pero confío aún less en él para encontrar confirmaciones de dos repositorys fuente originales separados. Creo que las ideas son buenas, así que si esto no encuentra el (los) viejo (s) jefe (s), primero searchía un mejor método para rastrear cada confirmación en la carpeta de objects y cualquier file (s) de package. .