¿Cómo mover un repositorio git a otro directorio y convertir ese directorio en un repositorio git?

101

Tengo un directorio gitrepo1 . Este directorio es un repositorio de git.

  • Me gustaría mover este gitrepo1 a otro directorio newrepo .

  • El directorio newrepo debería ser el nuevo repositorio de git sin pérdida de historial de git y debería contener el directorio gitrepo1 .

  • El directorio gitrepo1 debería ser solo un directorio ahora (dentro de newrepo ), sin ningún .gitíndice, es decir, ya NO debería ser un repositorio git independiente o un submódulo.

¿Cómo puedo hacer esto?

Pranjal Mittal
fuente
9
mv girepo1 newrepo??
ddavison

Respuestas:

109

Es muy simple. A Git no le importa cuál es el nombre de su directorio. Solo le importa lo que hay dentro. Entonces, simplemente puede hacer:

# copy the directory into newrepo dir that exists already (else create it)
$ cp -r gitrepo1 newrepo

# remove .git from old repo to delete all history and anything git from it
$ rm -rf gitrepo1/.git

Tenga en cuenta que la copia es bastante cara si el repositorio es grande y con una larga historia. También puedes evitarlo fácilmente:

# move the directory instead
$ mv gitrepo1 newrepo

# make a copy of the latest version
# Either:
$ mkdir gitrepo1; cp -r newrepo/* gitrepo1/  # doesn't copy .gitignore (and other hidden files)

# Or:
$ git clone --depth 1 newrepo gitrepo1; rm -rf gitrepo1/.git

# Or (look further here: http://stackoverflow.com/q/1209999/912144)
$ git archive --format=tar --remote=<repository URL> HEAD | tar xf -

Una vez que lo crea newrepo, el destino para colocar gitrepo1podría ser cualquier lugar, incluso adentro newreposi lo desea. No cambia el procedimiento, solo la ruta que está escribiendo gitrepo1.

Shahbaz
fuente
6
+1. Probablemente vale la pena mencionar este problema que afecta a los repositorios creados con la versión 1.7.8 o 1.7.9 de git, lo que puede significar que mover un repositorio de git lo vuelve inutilizable (aunque, como se indica, se corrige fácilmente).
AD7six
1
Estoy en la máquina wndows y estoy usando el símbolo del sistema. No pude encontrar el comando "cp". ¿El comando "cp" es específico de otro sistema operativo?
LP13
1
@ user3862378, cpcomo casi todos los comandos o funciones son específicos de otros sistemas operativos. De hecho, es específico para todos los sistemas operativos que no sean Windows. Intente llamar a microsoft y preguntarles por qué no son POSIX. De todos modos, cpsignifica copiar. mvsignifica moverse. rmsignifica eliminar. Puede encontrar equivalentes de Windows.
Shahbaz
@Shahbaz Gracias, la solución anterior crea la siguiente estructura "newrepo ->. Git" y "newrepo-> todos los demás archivos de gitrepo1" ... no es poner la carpeta "gitrepo1" dentro de "newrepo" ... tengo curiosidad si crear carpetas manualmente en Windows y mover la carpeta ".git" debajo de la carpeta raíz ... ¿funcionaría sin afectar el historial?
LP13
2
@ user3862378, no hay ninguna razón por la que no debería hacerlo. .git/contiene todo el historial, que incluye su última confirmación. Dondequiera que lo pongas, tienes toda la historia. De hecho, si todos los archivos de ese directorio son diferentes del repositorio original del que los tomó .git/, lo único que le indicaría que algunos archivos se eliminaron y algunos sin seguimiento están presentes. Con a git reset --hard, los archivos eliminados se recuperarían automáticamente. Lo único a tener en cuenta es que con solo copiar .git/no se pueden recuperar los cambios no confirmados.
Shahbaz
4

Es un poco tarde y la pregunta ya está respondida pero, para hacerlo sin dolor de cabeza:

  1. Vea cuál es la rama actual en la que se encuentra en la carpeta git anterior git status, digamos desarrollo de rama
  2. Cambie el directorio a la nueva carpeta git, luego git cloneel proyecto del repositorio a la nueva carpeta
  3. Verifique la rama actual en su nueva carpeta: git checkout development
  4. Sincronice su nueva carpeta con la anterior, utilizando rsync, excluyendo la carpeta .git :rsync -azv --exclude '.git' gitrepo1 newrepo/gitrepo1

Entonces estás listo para continuar donde lo dejaste

emremrah
fuente
1

Es incluso más simple que eso. Acabo de hacer esto (en Windows, pero debería funcionar en otro sistema operativo):

  1. Cree un nuevo repositorio .
  2. Mueva gitrepo1 a newrepo .
  3. Mueva .git de gitrepo1 a newrepo (sube un nivel).
  4. Confirme los cambios (corrija el seguimiento según sea necesario).

Git solo ve que agregó un directorio y renombró un montón de archivos. No es problema.

david.pfx
fuente
1

No soy un experto, pero copio la carpeta .git a una nueva carpeta, luego invoco: git reset --HARD

Reiniciar el universo
fuente