UPDATE: This will work more intuitively as of Git 1.8.3, see my own answer .Как сбросить git --hard в подкаталоге?
Представьте себе следующий прецедент: я хочу избавиться от всех изменений в конкретном подкаталоге моего рабочего дерева Git, оставив все остальные подкаталоги неповрежденными.
я могу сделать
git checkout .
, но git checkout . adds directories excluded by sparse checkoutСуществует
git reset --hard
, но он не позволит мне сделать это для поддиректории:> git reset --hard . fatal: Cannot do hard reset with paths.
Я могу изменить патч текущего состояния, используя
git diff subdir | patch -p1 -R
, но это скорее wei й способ сделать это.
Что такое надлежащая команда Git для этой операции?
Приведенный ниже сценарий иллюстрирует проблему. Вставьте правильную команду ниже комментария 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
как насчет 'git stash && git stash drop'? – CharlesB
как насчет 'git checkout -/path/to/subdir /'? – iberbeu
@CharlesB: 'git stash' не принимает аргумент пути ... – krlmlr