AKTUALIZACJA² : W Git 2.23 (sierpień 2019) pojawiło się nowe polecenie,
git restore
które to robi, zobacz przyjętą odpowiedź .AKTUALIZACJA : Będzie działać bardziej intuicyjnie od wersji Git 1.8.3, zobacz moją własną odpowiedź .
Wyobraź sobie następujący przypadek użycia: Chcę pozbyć się wszystkich zmian w określonym podkatalogu mojego drzewa roboczego Git, pozostawiając wszystkie pozostałe podkatalogi nietknięte.
Mogę
git checkout .
, ale idź do kasy. dodaje katalogi wykluczone przez rzadkie pobranieJest
git reset --hard
, ale nie pozwoli mi to zrobić dla podkatalogu:> git reset --hard . fatal: Cannot do hard reset with paths.
Znowu: Dlaczego git nie może wykonać twardego / miękkiego resetu według ścieżki?
Mogę odwrócić łatkę bieżącego stanu za pomocą
git diff subdir | patch -p1 -R
, ale jest to dość dziwny sposób na zrobienie tego.
Jakie jest właściwe polecenie Git dla tej operacji?
Poniższy skrypt ilustruje problem. Wstaw właściwe polecenie poniżej How to make files
komentarza - bieżące polecenie przywróci plik, a/c/ac
który powinien zostać wykluczony przez rzadkie pobieranie. Pamiętaj, że nie chcę jawnie przywracać, a/a
a a/b
jedynie „wiem” a
i chcę przywrócić wszystko poniżej. EDYCJA : I też nie „wiem” b
, ani które inne katalogi znajdują się na tym samym poziomie co 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 stash
nie akceptuje argumentu ścieżki ...
git stash && git stash drop
?