2009-09-30 13 views
65

Ho il mio repo @ github. Ho fatto un po 'di lavoro a casa e l'ho spinto a github. Ha comportato la cancellazione di file e directory. Ora sono nella mia casella di lavoro, che aveva una copia del codice prima di eliminare i file e le directory.Git checkout/pull non rimuove le directory?

ho rilasciato la seguente:.

git remote update 
git checkout HEAD 
git pull origin HEAD 

E 'cancellato tutti i file che dovrebbe avere, ma non le directory i file erano in

Due domande:

  1. Perché non rimuovere le directory?
  2. C'è un comando git che posso rilasciare nello stato corrente per rimuoverli?
+0

Sei sicuro di volere HEAD? – innaM

+0

Concordato, checkout git HEAD non fa nulla, poiché HEAD è un riferimento che punta al commit attualmente estratto. Probabilmente andresti per maestro in entrambi i casi. – Cascabel

+0

Bene, HEAD ha effettivamente aggiornato tutto con l'eccezione dell'eliminazione delle directory vuote. Come ho detto, sono nuovo di git. – mculp

risposta

132

Git non tiene traccia delle directory, quindi non rimuoverà quelle che diventano vuote a seguito di un'unione o di altre modifiche. Tuttavia, è possibile utilizzare git clean -fd per rimuovere le directory non tracciate (il flag -fd significa f o la rimozione di file non tracciati e d irectories).

+4

Sono confuso. Allora perché le directory sono state cancellate dal mio repository GitHub quando ho commesso/spinto le modifiche? – mculp

+1

Le directory nella tua copia di lavoro possono contenere file non tracciati (inclusi i file nascosti non tracciati), quindi potrebbero sembrare vuoti, ma in realtà non lo sono, quindi Git non li ha rimossi. 'git clean' sarà, ovviamente. – mipadi

+0

Grazie per il comando. Li ha ripuliti. Tuttavia, continuo a non capire perché ha cancellato le directory su un commit/push ma non su un checkout/pull. Le directory non contenevano file nascosti o nascosti. – mculp

-1

Git non tiene directory attualmente (vedi git wiki), che è, è possibile aggiungere né directory vuote né git rimuovere le directory che finiscono per vuoto. (EDIT: Grazie, Manni, mi sbagliavo Non si può aggiungere directory vuote, ma git sarà rimuovere directory che diventano vuote perché il loro contenuto è stato eliminato rintracciato !.)

Per quanto riguarda il comando per rimuovere le directory vuote: dipende dal tuo sistema operativo.

Per Linux è possibile utilizzare, ad esempio,

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

Tuttavia, questo rimuoverà tutti directory vuote!

+1

La pagina wiki dice che git non crea directory vuote per te. Non ** dice ** che non cancellerà le directory vuote. Cosa mcp80 vuole funzionare per me. – innaM

+0

@janko, In realtà, git non è riuscito a rimuovere una directory completamente vuota per me. –

2

Come parte della maggior parte delle operazioni che alterano l'albero di lavoro (pull, merge, checkout, ecc.) Git rimuoverà tutte le directory rese vuote da tale operazione (cioè git rimosso l'ultimo file).

git non rimuovere le directory che non sono completamente vuoti, quindi se hai nascosto o ignorato i file poi basta perché git rimuove l'ultimo monitorati file da quella directory, non significa necessariamente che git sarà in grado per rimuovere quella directory. git non considera questa una condizione di errore, quindi non ci lamenteremo.

+0

Il mio repository GitHub non ha le directory. Quando ho commesso, ha rimosso le directory correttamente. Tuttavia, quando eseguo il checkout/pull rimuovi solo i file. Le directory sono vuote. $ ls -al totale 8 drwxr-xr-x 2 mculp mculp 4096 23 Settembre 15:43 ./ drwxr-xr-x 8 mculp mculp 4096 30 Settembre 10:51 ../ – mculp

+1

io non sono molto Sicuramente cosa intendi con "commutato HEAD da padroneggiare", presumo tu voglia dire "' git checkout master' "ma la maggior parte delle persone direbbe semplicemente" Sono passato a/controllato da maestro ". Ad ogni modo, quando ha detto "già aggiornato". significa che non ha fatto nulla. git rimuoverà solo le directory che * rende * vuote. –

+0

Formulazione errata. Ho cambiato "HEAD" in "master" come alcuni hanno suggerito nei commenti. – mculp

1

Git non tiene traccia di directory, file (con il loro percorso). Git crea tutte le directory per quei percorsi se non esistono ancora (cool!), Tuttavia lo fa non cancellarli se tutti i file contenuti in un percorso sono stati spostati o cancellati (non è bello ☹ ... ma ci sono dei motivi).

Solution (una volta che avete tirato/avanzare rapidamente/fusione):

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

Se non stash prima clean, si perderanno tutti i vostri file non monitorate (irreversibile).

Nota: poiché questo pulisce anche tutti i file ignorati, potrebbe essere necessario eseguire nuovamente alcuni script di build per ricreare i metadati del progetto (ad esempio: ./gradlew eclipse). Questo elimina anche le directory che sono vuote e che non fanno mai parte dei percorsi dei file git.

Problemi correlati