AGGIORNAMENTO² : Con Git 2.23 (agosto 2019), c'è un nuovo comando
git restoreche fa questo, vedi la risposta accettata .AGGIORNAMENTO : Funzionerà in modo più intuitivo a partire da Git 1.8.3, vedi la mia risposta .
Immagina il seguente caso d'uso: voglio sbarazzarmi di tutte le modifiche in una specifica sottodirectory del mio albero di lavoro Git, lasciando intatte tutte le altre sottodirectory.
Posso fare
git checkout ., ma git checkout. aggiunge le directory escluse dal checkout sparseSì
git reset --hard, ma non mi permette di farlo per una sottodirectory:> git reset --hard . fatal: Cannot do hard reset with paths.Ancora: perché git non è in grado di eseguire reimpostazioni hard / soft per percorso?
Posso applicare una patch inversa allo stato corrente usando
git diff subdir | patch -p1 -R, ma questo è un modo piuttosto strano di farlo.
Qual è il comando Git corretto per questa operazione?
Lo script seguente illustra il problema. Inserisci il comando corretto sotto il How to make filescommento: il comando corrente ripristinerà il file a/c/acche dovrebbe essere escluso dal checkout sparse. Nota che non voglio ripristinare esplicitamente a/ae a/b, solo "so" ae voglio ripristinare tutto ciò che segue. EDIT : E anche io non "sapere" b, o quali altre directory risiedono allo stesso livello di a.
#!/bin/sh
rm -rf repo; git init repo; cd repo
for f in a b; do
for g in a b c; do
mkdir -p $f/$g
touch $f/$g/$f$g
git add $f/$g
git commit -m "added $f/$g"
done
done
git config core.sparsecheckout true
echo a/a > .git/info/sparse-checkout
echo a/b >> .git/info/sparse-checkout
echo b/a >> .git/info/sparse-checkout
git read-tree -m -u HEAD
echo "After read-tree:"
find * -type f
rm a/a/aa
rm a/b/ab
echo >> b/a/ba
echo "After modifying:"
find * -type f
git status
# How to make files a/* reappear without changing b and without recreating a/c?
git checkout -- a
echo "After checkout:"
git status
find * -type f
git checkout -- /path/to/subdir/?
git stashnon accetta un argomento sul percorso ...
git stash && git stash drop?