【发布时间】:2013-03-02 12:32:16
【问题描述】:
更新²:在 Git 2.23(2019 年 8 月)中,有一个新命令
git restore可以执行此操作,请参阅 accepted answer。更新:这将从 Git 1.8.3 开始更直观地工作,请参阅 my own answer。
想象以下用例:我想删除 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反向修补当前状态,但这是一种相当奇怪的方式。
该操作的正确 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
【问题讨论】:
-
git stash && git stash drop怎么样? -
git checkout -- /path/to/subdir/呢? -
@CharlesB:
git stash不接受路径参数... -
@iberbeu:不。还将添加被稀疏结帐排除的文件。
-
@CharlesBailey:那为什么会有一个单选按钮显示“从可靠和/或官方来源寻找答案”。在赏金对话框中?不是我自己写的!还可以尝试谷歌搜索“git reset subdirectory”(不带引号)并查看前 3 个位置的内容。当然,发往 kernel.org 邮件列表的消息会更难找到。 -- 另外,我还不清楚这种行为是错误还是功能。
标签: git reset git-reset sparse-checkout