Как сделать 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 не может делать жесткий / мягкий сброс по пути?

Я могу изменить текущее состояние, используя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

Ответы на вопрос(8)

Ваш ответ на вопрос