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