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”blub 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

questionAnswers(8)

yourAnswerToTheQuestion