Jak zresetować git - twardy podkatalog?
AKTUALIZACJA: To będzie działać bardziej intuicyjnie od Git 1.8.3, zobaczmoja własna odpowiedź.
Wyobraź sobie następujący przypadek użycia: Chcę pozbyć się wszystkich zmian w określonym podkatalogu drzewa roboczego Git, pozostawiając wszystkie pozostałe podkatalogi w stanie nienaruszonym.
mogę zrobićgit checkout .
, alegit checkout. dodaje katalogi wykluczone przez rzadkie pobieranie
Jestgit reset --hard
, ale nie pozwoli mi to zrobić dla podkatalogu:
> git reset --hard .
fatal: Cannot do hard reset with paths.
Jeszcze raz:Dlaczego git nie może zresetować twardych / miękkich ścieżek?
Mogę odwrócić poprawkę bieżącego stanu za pomocągit diff subdir | patch -p1 -R
, ale jest to dość dziwny sposób.
Jaka jest właściwa komenda Git dla tej operacji?
Poniższy skrypt ilustruje problem. Wstaw odpowiednie polecenie poniżejHow to make files
komentarz - bieżące polecenie przywróci plika/c/ac
który ma być wykluczony przez rzadkie kasowanie. Zauważ, że janie rób chcesz wyraźnie przywrócića/a
ia/b
, Ja tylko wiem"a
i chcę przywrócić wszystko poniżej.EDYTOWAĆ: I ja też nie „wiem”b
lub które inne katalogi znajdują się na tym samym poziomie coa
.
#!/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