¿Git checkout / pull no elimina directorios?

82

Tengo mi repositorio @ github. Trabajé en casa y lo empujé a github. Implicó la eliminación de archivos y directorios. Ahora estoy en mi caja de trabajo, que tenía una copia del código antes de eliminar los archivos y directorios.

Emití lo siguiente:

git remote update
git checkout HEAD
git pull origin HEAD

Eliminó todos los archivos que debería tener, pero no los directorios en los que estaban los archivos.

Dos preguntas:

  1. ¿Por qué no eliminó los directorios?
  2. ¿Hay un comando git que pueda emitir en el estado actual para eliminarlos?
mculp
fuente
De acuerdo, git checkout HEAD no hace nada, ya que HEAD es una referencia que apunta a la confirmación actualmente comprobada. Probablemente ibas por maestro en ambos casos.
Cascabel
Bueno, HEAD actualizó todo con la excepción de eliminar los directorios vacíos. Como dije, soy nuevo en git.
mculp
Posible duplicado de ¿Cómo fuerzo a "git pull" a sobrescribir los archivos locales? Compruebe las respuestas allí si aún desea algunas soluciones diferentes.
DrBeco

Respuestas:

151

Git no realiza un seguimiento de los directorios, por lo que no eliminará los que queden vacíos como resultado de una fusión u otro cambio. Sin embargo, se puede utilizar git clean -fdpara eliminar los directorios sin seguimiento (los -fdmedios bandera f eliminación orce de archivos sin seguimiento y d irectories).

mipadi
fuente
4
Estoy confundido. Entonces, ¿por qué se eliminaron los directorios de mi repositorio de GitHub cuando realicé / presioné los cambios?
mculp
1
Los directorios en su copia de trabajo pueden haber contenido archivos sin seguimiento (incluidos archivos ocultos sin seguimiento) y, por lo tanto, pueden parecer vacíos, pero en realidad no lo son, por lo que Git no los eliminó. git cleanlo hará, por supuesto.
mipadi
4
Puede tener algo que ver con el hecho de que los repositorios de GitHub son repositorios desnudos (no tienen copias de trabajo), pero el local sí. Me imagino que si clonaras un nuevo repositorio desde el origen de GitHub, no tendrías esos directorios.
mipadi
18
Pero, por supuesto, ejecute el comando con -n(ejecución en seco) en lugar de -fprimero, para que pueda ver qué se va a eliminar. Especialmente porque git clean -delimina no solo esos directorios preocupantes, sino también los archivos sin seguimiento.
Todd Owen
2
@EliGolin: git cleanno elimina los archivos enumerados en .gitignore a menos que pase la -xopción.
mipadi
4

Como parte de la mayoría de las operaciones que alteran el árbol de trabajo (extracción, fusión, verificación, etc.), git eliminará cualquier directorio que quede vacío por esa operación (es decir, git eliminó el último archivo).

git no eliminará ningún directorio que no esté completamente vacío, por lo que si ha ocultado o ignorado archivos, el hecho de que git elimine el último archivo rastreado de ese directorio no significa necesariamente que git podrá eliminar ese directorio. git no considera que esto sea una condición de error, por lo que no se quejará de ello.

CB Bailey
fuente
Mi repositorio de GitHub no tiene los directorios. Cuando me comprometí, eliminó los directorios correctamente. Sin embargo, cuando realizo la compra / extracción, solo elimina los archivos. Los directorios están vacíos. $ ls -al total 8 drwxr-xr-x 2 mculp mculp 4096 23 de septiembre 15:43 ./ drwxr-xr-x 8 mculp mculp 4096 30 de septiembre 10:51 ../
mculp
1
No estoy muy seguro de lo que quieres decir con "cambié HEAD a maestro", supongo que te refieres a " git checkout master" pero la mayoría de la gente simplemente diría "Cambié a / revisé maestro". De todos modos, cuando git dijo 'Ya actualizado'. significa que no hizo nada. git solo eliminará los directorios que deje vacíos.
CB Bailey
Mala redacción. Cambié "HEAD" a "master" como sugirieron algunas personas en los comentarios.
mculp
@CharlesBailey, lo que dijiste no es lo que veo. git checkoutno eliminó un directorio completamente vacío.
Acumenus
@ABB: Git sólo elimina los directorios que se hicieron vacía por una operación de pago y envío. He probado esto de nuevo; aún funciona.
CB Bailey
2

Git no rastrea directorios, archivos (con su ruta). Git crea todos los directorios para esas rutas si aún no existen (¡genial!), Sin embargo, no los elimina si todos los archivos contenidos en una ruta se mueven o eliminan (no es genial ☹ ... pero hay razones).

Solución (una vez que haya extraído / adelantado / fusionado):

git stash --include-untracked
git clean -fd
git stash pop

Si no lo hace stashantes clean, perderá todos sus archivos sin seguimiento (irreversiblemente).

Nota: dado que esto también limpia todos los archivos ignorados, es posible que deba ejecutar algunos de sus scripts de compilación nuevamente para recrear los metadatos del proyecto (por ejemplo:) ./gradlew eclipse. Esto también elimina los directorios que están vacíos y que nunca fueron parte de las rutas de los archivos git.

qwertzguy
fuente
2

Tuve el mismo problema, en mi caso en el servicio de compilación (CI) ... ya que GIT extrae todos los archivos sin limpiar las carpetas, todos los bin / obj que fueron compilados previamente por CI están sucios, por lo que si elimino un proyecto de prueba, el bin todavía contendrá la DLL y mencionará pruebas que no existen.

Para solucionar este problema; este comando parece hacer el truco (al menos para mí)

git clean -fd -x

donde X eliminará todos los archivos sin seguimiento:

-X Elimina solo los archivos ignorados por Git. Esto puede resultar útil para reconstruir todo desde cero, pero conserva los archivos creados manualmente.

Yogurtu
fuente
-1

Git no rastrea directorios actualmente (ver git wiki ), es decir, no puedes agregar directorios vacíos ni eliminará directorios que terminen vacíos. (EDITAR: ¡ Gracias, Manni, estaba equivocado! No se pueden agregar directorios vacíos, pero git eliminará los directorios que queden vacíos porque se eliminó su contenido rastreado ) .

En cuanto al comando para eliminar los directorios vacíos: eso depende de su sistema operativo.

Para Linux puede usar, por ejemplo,

find -depth -type d -empty -exec rmdir {} \;

Sin embargo, esto eliminará todos los directorios vacíos.

Janko
fuente
1
La página wiki dice que git no crea directorios vacíos para ti. No , no diga que no va a eliminar los directorios vacíos. Lo que quiere Mculp funciona para mí.
innaM
@janko, en realidad, git no pudo eliminar un directorio completamente vacío para mí.
Acumenus