Mi repositorio de Git está en el directorio raíz incorrecto. ¿Puedo moverlo? (../ en vez de ./)

118

De alguna manera, cuando git initedité mi último proyecto hace aproximadamente un mes, ejecuté el comando en el directorio un directorio más alto que la raíz de mi proyecto.

Entonces mi repositorio está en el ./projectdirectorio y no en el ./project/my-new-projectdirectorio. No sé cómo no me di cuenta del problema antes, pero nunca busqué el directorio .git hasta ahora.

¿Hay alguna manera, sin matar mi proyecto, de mover el repositorio al directorio adecuado y luego decirle a git cuál es la nueva base del proyecto? Mover el directorio no funciona. Git cree que se han eliminado todos los archivos.

Miguel
fuente

Respuestas:

19

Probablemente lo más simple, a menos que ya haya creado algún historial que desee guardar, sería simplemente eliminar el .gitsubdirectorio y rehacer el inicio en el directorio correcto.

Si usó git para resolver el problema, cualquier solución dejaría necesariamente un montón de entradas del historial de "movió este archivo aquí" que en realidad no son cambios, pero está arreglando un error en el momento de la creación. Es mejor crearlo bien.

TED
fuente
2
Veo lo que está diciendo, pero cualquier acción in-git que realice para corregir esto terminará dejando un montón de historiales de "movió este archivo aquí" que en realidad no son cambios, pero está arreglando un error en el momento de la creación. Es mejor crearlo bien.
TED
8
Esto rompe muchas cosas. stackoverflow.com/a/3247756/825364 es una forma mucho mejor de hacerlo.
Steve Tauber
2
Bueno, guardar algo de historia es para lo que se usa Git. ¿Quizás deberíamos simplemente eliminar el subdirectorio .git y desinstalar Git de nuestro sistema? ¡Usar un servidor ftp en lugar de vcs es probablemente lo más simple después de todo!
Gherman
2
la respuesta a continuación es un enfoque mucho mejor, ya que conserva toda la historia
BigMikeW
2
Entonces, para mí, hice esto e inmediatamente me di cuenta de mi error. sin tener que preocuparse por ningún cambio, esta es la forma más fácil de volver a la pizarra limpia.
Mike
261

Tuve el problema opuesto: tuve que cambiar la raíz de git al directorio principal (de proyecto / src a proyecto) Para mi gran sorpresa, ¡lo siguiente funcionó!

src$ mv .git ../ 
src$ cd ..
project$ git add src
project$ git commit -a

git detectó inteligentemente que todos los archivos nuevos fueron renombrados como versiones de los antiguos y no se perdió ningún historial

Puede intentar algo similar ... mueva la carpeta .git y agregue los archivos nuevamente antes de confirmar

Abhishek Anand
fuente
8
Esto funcionó perfectamente para mí. También moví otros archivos de configuración .git * del directorio como .gitigore
Relequestual
7
Mi querido señor, es un salvador de vidas. Esto realmente FUNCIONA. Gracias.
Radu Murzea
1
Además, tomé git rm'dlos archivos de su ubicación anterior, por lo que git status(correctamente) terminé informando una serie de operaciones de cambio de nombre. Cuanto más trabajo con git, más me gusta.
ssc
7
@Mike esto debe marcarse como la respuesta aceptada. Es una solución preferida para reiniciar porque no pierde el historial. Si no me cree, el recuento de votos a favor habla por sí solo.
Joseph Spens
3
¡Gracias! Me funcionó, pero tuve que hacer un par de cosas más: 1. Antes de comprometerme, actualicé .gitignorey ejecuté git add -Aen la carpeta raíz; después de esto, git mostró correctamente todos los archivos como en renamedlugar de deleted. 2. Como uso submódulos, tuve que moverme .gitmodulesa la nueva raíz y actualizar la ruta del submódulo en los distintos archivos de configuración de git. Para encontrar qué archivos modificar, ejecutégrep -nrI --color 'old/path/to/submodule' .
Guido Walter Pettinari
43

Esto funcionó para mí y mantuvo intacta toda mi historia. Desde la carpeta raíz incorrecta (el padre donde accidentalmente inicializó el repositorio):

Mover la carpeta:

mv .git thecorrectfolder/

Reinicialice el repositorio de git:

cd thecorrectfolder/
git init

Vuelva a agregar todos los archivos, confirme y envíe:

git add .
git commit -am 'fixing things'
git push origin master

¡Hecho! Consíguete una cerveza.

Cuando confirme el repositorio de git después de reinicializar, obtendrá un montón de resultados que se ven así:

rename {ethanode/coffee => coffee}/app.coffee (100%)

En otras palabras, todas sus referencias de la carpeta principal y el cambio de nombre para usar la carpeta correcta.

holmesal
fuente
¡Gracias! ¡Este método era exactamente lo que necesitaba!
Giel Berkers
Esto funcionó para mí, pero fue un poco feo. En lo que respecta a git, no "moví" nada, simplemente borré cientos de archivos y luego agregué cientos de otros archivos idénticos.
bjmc
6
git init no es necesario y la parte restante es la misma que mi respuesta, que se envió años antes que la suya: stackoverflow.com/a/3247756/391753
Abhishek Anand
35

git filter-branchte permite reescribir la historia de esa manera. La git filter-branchpágina de manual incluso tiene su caso como ejemplo :

Para reescribir el repositorio para que parezca que foodir / hubiera sido la raíz del proyecto y descartar el resto del historial:

git filter-branch --subdirectory-filter foodir -- --all

Probablemente desee git clonecolocar el repositorio en un nuevo subdirectorio antes (¿o después?) De la git filter-branchejecución. (Clonar antes de filter-branch y ejecutar filter-branch en el nuevo clon tendría la ventaja de dejar el .git/directorio original en su lugar como respaldo en caso de que algo salga mal).

ndim
fuente
1
Esto no "descarta el resto del historial " (lo que sugiere que el .gitrepositorio permanece en el nivel superior mientras que los subdirectorios se "consideran la raíz"); esto literalmente descartará todos los demás archivos en el repositorio y moverá todos los subdirectory/*archivos a la carpeta raíz. .
Louis Maddox
Excelente respuesta, pero tenga en cuenta que si hay un archivo .gitignore (si se rastrea), se perderá con esta operación. Además, deberá realizar una git push --forceactualización del repositorio de subida después de esto.
waldyrious
12

Git puede recordar archivos con sus hashes,

Simplemente mueva su .gitdirectorio raíz y dígale gitque recuerde todos los cambios de archivos con la --allopción.

$ mv .git ../
$ cd ..
$ git add . --all 
$ git status // => you can see all the files recognized as renamed 100%
$ git commit -m "Moves repo to root directory."
M. Reza Nasirloo
fuente
3

Use git-mvpara mover sus archivos "arriba" a la ubicación adecuada, luego git-rmal directorio "my-new-project".

jkndrkn
fuente
Es al revés. No quiero mover todos mis archivos al directorio en el que se encuentra git (hay muchas otras cosas allí ... sería molesto) y luego mover git hacia arriba. Quiero mover el repositorio al directorio raíz de mi proyecto.
Mike
2

Vine aquí buscando una forma de mover mi repositorio a cualquier parte .

En caso de que no fuera el único, esto es lo que hice al final:

https://git.wiki.kernel.org/index.php/GitFaq#How_do_I_clone_a_repository_with_all_remotely_tracked_branches . en esa nueva carpeta. (Luego verificó si los archivos y el registro habían aparecido o no). Mantuve el antiguo repositorio por un tiempo, por si acaso ...

De esa manera pude mover mi repositorio sin perder el historial.

Saludos cordiales, Dinah

usuario1565849
fuente
Corrígeme si me equivoco, pero parece que podrías haberlo logrado simplemente moviendo el directorio del repositorio a su posición designada usando nada más que herramientas simples del sistema de archivos, como mv /path/to/the/old/location/of/the/repo /path/to/the/new/location/of/the/repo.
cueedee
2

Habiendo pasado por este mismo problema, mi solución final fue:

  1. Mueva la carpeta .git a donde debe estar.
  2. Cambie el directorio a la carpeta a la que acabo de mover .git
  3. Restablece el contenido de la carpeta a lo que git cree que debería ser: git reset --hard HEAD
  4. Verifique que el contenido coincida con lo que debería ser con kdiff3 u otra herramienta de comparación
  5. Elimine los archivos ahora sin versión en la ubicación anterior.

Funcionó como magia sin impacto en la historia. - NB Si ha realizado algunos cambios, asegúrese de confirmarlos antes de mover el directorio .git.

Steve Barnes
fuente
-3

Aquí hay dos formas:

  1. cd TheWrongDirectory rm -rf .git

  2. simplemente BORRE la carpeta .git y cd al directorio correcto.

V. Rance
fuente