我有一个git repo,我在本地替换了很多文件。
git status现在显示许多修改过的文件。
有些是“真正修改过”,有些只是因行结尾而不同。
我希望那些只有行结尾不同的东西消失(git重置它们),但是 我似乎无法找到linux-piping-foo来实现它。
如何删除唯一不同的是可执行位的文件的加分点。
答案 0 :(得分:44)
这样做:
git diff -b --numstat \
| egrep $'^0\t0\t' \
| cut -d$'\t' -f3- \
| xargs git checkout HEAD --
diff -b
找到没有变化的文件。git checkout
对分支机构。对于你离开的每一步,这个管道会做一些合理的事情,所以你可以从第一行开始,然后添加更多以查看每一步发生的事情。
可能有用的替代最后一行:
| git checkout-index --stdin
这会将文件重置为其暂存内容而不是上次提交的状态。
您可能还想在第一行使用git diff HEAD
来获取工作副本与最后一次提交的差异而不是索引。
注意:如果您的文件名中包含空格,则首先需要添加tr
:
git diff -b --numstat \
| egrep $'^0\t0\t' \
| cut -d$'\t' -f3- \
| tr '\n' '\0' \
然后,您必须将-0
/ -z
开关添加到您想要使用的最终命令中:
| xargs -0 git checkout HEAD --
# or
| git checkout-index --stdin -z
答案 1 :(得分:2)
cd /mnt/c
。cd repos/my-project
git diff -b --numstat \
| egrep $'^0\t0\t' \
| cut -d$'\t' -f3- \
| xargs git checkout HEAD --
答案 2 :(得分:1)
如果您对bash过敏并且更喜欢powershell(为清晰起见而格式化)...
git diff --numstat --ignore-space-change --ignore-all-space
--ignore-blank-lines --ignore-cr-at-eol
--ignore-space-at-eol
| % {($added,$deleted,$path)= $_.Split("`t");
if ("$added$deleted" -eq "00") {$path}
| % { git checkout HEAD $_}
请注意,这是一种非常激进的方法-我在这里使用的git选项也将忽略添加/删除的空行。还请记住,当在字符串中间时,空格甚至换行符在语义上都是有意义的,因此请牢记这一点。
某些git选项可能是多余的,但出于偏执狂的缘故,我将它们包括在内。您不妨细读documentation来构成自己的解释。
这是用于剪切和粘贴的稍微麻烦的实现...
git diff --numstat -b -w --ignore-blank-lines --ignore-cr-at-eol --ignore-space-at-eol | % {($a,$d,$p)= $_.Split("`t");if ("$a$d" -eq "00") {$p}| % { git checkout HEAD -- $_}
正如其他地方所指出的那样,建议您先进行更改的副本,然后再通过运行git stash
或先复制到备份文件夹来进行恢复。
答案 3 :(得分:0)
虽然看起来你最初正在寻找基于管道的解决方案而你从@ aristotle-pagaltzis那里得到它,因为它有点难以记住,我认为这个替代方案值得注意:
git diff -b > gitdiffb
git stash # or git reset --hard if you feel confident
git apply --ignore-space-change gitdiffb
如果不仅仅是更改空白数字,而且应该忽略全新或完全删除的空格,请将-b
替换为-w
。
即使在包含相关更改的文件中,结果也不同于基于管道的解决方案,即删除空白更改。 因此,它并不完全是你所描述的方式,但对于大多数通过搜索引擎来到这里的人来说,可能正在寻找这个。