2015-11-26 26 views
8

Voglio eseguire il checkout su un altro ramo o su un commit precedente, ma voglio mantenere una cartella con gli stessi file (non eseguire il checkout della cartella).Checkout GIT ad eccezione di una cartella

Voglio che la cartella, verrà mostrata in git status, così ora posso aggiungere questa cartella all'indice.

Ad esempio, ho una cartella con node_modules. Voglio che la cartella sia in tutti i miei commit (so che la maggior parte delle persone preferisce .gitignore alla cartella node_modules). Ma quando mi sposto in altro commit, o checkout altro ramo, voglio che git non tocchi la cartella node_modules.

È possibile?

risposta

14

È possibile utilizzare sparse checkout per escludere il contenuto impegnato della directory node_modules dall'albero di lavoro. Come dice la documentazione:

"Verifica sparsa" consente di compilare la directory di lavoro in modo spartano. Usa il bit skip-worktree per dire a Git se vale la pena guardare un file nella directory di lavoro.

Ecco come lo si utilizza. In primo luogo, si attiva l'opzione sparseCheckout:

git config core.sparseCheckout true 

Poi, si aggiunge il percorso node_modules come negazione nel file .git/info/sparse-checkout:

echo -e "/*\n!node_modules" >> .git/info/sparse-checkout 

Questo creerà un file chiamato sparse-checkout contenente:

/* 
!node_modules 

che significa efficacemente ignorare ilnode_modules directory durante la lettura di un albero di commit nella directory di lavoro.

Se poi si desidera includere la directory node_modules di nuovo (cioè rimuovere il skip-worktree bit dalle sue file) è necessario modificare il file sparse-checkout a contenere solo /* - che è "includere tutti i percorsi" - e aggiornare la directory di lavoro utilizzando git read-tree :

echo "/*" > .git/info/sparse-checkout 
git read-tree -mu HEAD 

È quindi possibile disabilitare cassa sparse complessivamente modificando la sua variabile di configurazione false:

git config core.sparseCheckout false 

Si noti che sparse checkout è stato introdotto per la prima volta in Git 1.7.0.

+0

Grazie! Solo per confermare. se un giorno rimuoverò 'node_modules' dal file' sparse-checkout', posso normalmente tornare al passato e vedere cosa conteneva in passato? (Ho letto il link che hai inviato, ma non ho capito cosa significhi 'skip-worktree bit '... – Aminadav

+0

Sì, puoi. Ho aggiornato la mia risposta per includere come re-introdurre la directory' node_modules' e disabilitare il check-out sparsi –

+0

Molto interessante.Dovrò verificarlo (non git checkout), ho bisogno di testarlo :) – Aminadav