ОБНОВЛЕНИЕ. Это будет работать более интуитивно с Git 1.8.3, см. мой собственный ответ.
Представьте себе следующий прецедент: я хочу избавиться от всех изменений в отдельном подкаталоге моего рабочего дерева Git, оставив все остальные подкаталоги неповрежденными.
-
Я могу сделать
git checkout .
, но git checkout. добавляет каталоги, исключенные из-за разреженной проверки -
Существует
git reset --hard
, но он не позволит мне сделать это для подкаталога:> git reset --hard . fatal: Cannot do hard reset with paths.
Снова: Почему Git не может выполнить жесткий/мягкий сброс по пути?
-
Я могу изменить текущее состояние с помощью
git diff subdir | patch -p1 -R
, но это довольно странный способ сделать это.
Какова правильная команда Git для этой операции?
Ниже приведена script. Вставьте правильную команду под комментарием How to make files
- текущая команда восстановит файл a/c/ac
, который должен быть исключен из-за разреженной проверки. Обратите внимание: я не хочу явно восстанавливать a/a
и a/b
, я только "знаю" a
и хочу восстановить все ниже. EDIT. И я также не знаю "b
, или какие другие каталоги находятся на том же уровне, что и 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