UPDATE² : Git 2.23 (2019 年 8 月) では、これを行う新しいコマンドがあります。受け入れられた回答
git restore
を参照してください。更新:これは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
and 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