2009-09-30 15 views
65

Tengo mi repo @ github. Hice un poco de trabajo en casa y lo empujé a github. Implicaba algunas eliminaciones de archivos y directorios. Ahora estoy en mi buzón de trabajo, que tenía una copia del código antes de eliminar los archivos y directorios.Git checkout/pull no elimina directorios?

que emitió la siguiente:.

git remote update 
git checkout HEAD 
git pull origin HEAD 

Se eliminarán todos los archivos que debe tener, pero no los directorios de los archivos estaban en

Dos preguntas:

  1. ¿Por qué no elimina los directorios?
  2. ¿Existe un comando git que pueda emitir en el estado actual para eliminarlos?
+0

¿Seguro que quieres HEAD? – innaM

+0

Acordado, git checkout HEAD no hace nada, ya que HEAD es una referencia que apunta al compromiso actualmente desprotegido. Probablemente ibas a ser maestro en ambos casos. – Cascabel

+0

Bueno, HEAD realmente actualizó todo con la excepción de eliminar los directorios vacíos. Como dije, soy nuevo en git. – mculp

Respuesta

132

Git no hace un seguimiento de los directorios, por lo que no eliminará los que se vacíen como resultado de una combinación u otro cambio. Sin embargo, puede usar git clean -fd para eliminar directorios no rastreados (la bandera -fd significa f orce eliminación de archivos no rastreados y d irectories).

+4

Estoy confundido. Entonces, ¿por qué los directorios se eliminaron de mi repositorio de GitHub cuando cometí/presioné cambios? – mculp

+1

Es posible que los directorios en su copia de trabajo contengan archivos sin seguimiento (incluidos los archivos ocultos sin seguimiento) y, por lo tanto, pueden parecer vacíos, pero realmente no lo son, por lo que Git no los eliminó. 'git clean' lo hará, por supuesto. – mipadi

+0

Gracias por el comando. Eso los limpió. Sin embargo, todavía no entiendo por qué borró los directorios en un commit/push pero no en un checkout/pull. Los directorios no contenían archivos ocultos ni ocultos. – mculp

-1

Git no hace un seguimiento directorios actualmente (ver git wiki), , es decir, que no puede agregar directorios vacíos ni GIT eliminar directorios que terminan vacía. (EDIT: Gracias, Manni, estaba equivocado No se puede agregar directorios vacíos, pero Git eliminar directorios que se convierten en vacío porque se ha eliminado su contenido rastreado !).

cuanto a el comando para eliminar los directorios vacíos: eso depende de tu sistema operativo.

Para Linux se puede utilizar, por ejemplo,

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

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

+1

La página wiki dice que git no crea directorios vacíos para usted. ** No ** dice que no eliminará los directorios vacíos. Lo que mculp quiere funciona para mí. – innaM

+0

@janko, En realidad, git no pudo eliminar un directorio completamente vacío para mí. –

2

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

git no eliminará todos los directorios que no son completamente vacío, por lo que si has ocultado o ignorado archivos a continuación, sólo porque git elimina el último rastreados archivo desde ese directorio no significa necesariamente que git podrá para eliminar ese directorio git no considera que esto sea una condición de error, por lo que no se quejará de ello.

+0

Mi repositorio de GitHub no tiene los directorios. Cuando me comprometí, eliminó los directorios correctamente. Sin embargo, cuando pago/retiro, solo quita los archivos. Los directorios están vacíos. $ ls -al total de 8 drwxr-xr-x 2 McUlp McUlp 4096 Sep 23 de 15:43 ./ drwxr-xr-x 8 McUlp McUlp 4096 Sep 30 de 10:51 ../ – mculp

+1

No estoy muy seguro de lo que quiere decir con "cambió HEAD por maestro", supongo que quiere decir "maestro de pago de git", pero la mayoría de la gente simplemente dice "cambié a/comprobó el maestro". De todos modos, cuando git dijo 'Ya está actualizado'. significa que no hizo nada. git solo eliminará los directorios que * haga * vacíos. –

+0

Mala redacción. Cambié "HEAD" por "master" como algunas personas han sugerido en los comentarios. – mculp

1

Git no rastrea directorios, archivos (con su ruta). Git crea todos los directorios para esas rutas si todavía no existen (¡guay!), Sin embargo, lo hace no elimínelos si todos los archivos contenidos en una ruta se mueven o eliminan (no es genial ☹ ... pero hay razones)

Solución (una vez que se han retirado/reenviado rápido/fusionada):

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

Si no stash antes clean, perderá todos sus archivos sin seguimiento (irreversible).

Nota: como esto también limpia todos los archivos ignorados, es posible que deba ejecutar algunas de sus secuencias de comandos 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.

Cuestiones relacionadas