我有一个Git仓库,在本地替换了许多文件。
现在,git status显示很多已修改的文件。
其中一些是“真正修改过的”,另一些只有行尾不同。
我想让那些只有行尾不同的文件消失(使用 git reset ),但我似乎找不到能够实现它的Linux管道命令。
如果能告诉我如何删除唯一不同之处是可执行位的文件,则额外奖励分数。
我有一个Git仓库,在本地替换了许多文件。
现在,git status显示很多已修改的文件。
其中一些是“真正修改过的”,另一些只有行尾不同。
我想让那些只有行尾不同的文件消失(使用 git reset ),但我似乎找不到能够实现它的Linux管道命令。
如果能告诉我如何删除唯一不同之处是可执行位的文件,则额外奖励分数。
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- \
<b>| tr '\n' '\0' \</b>
那么您必须在您想要使用的最终命令中添加-0
/-z
开关:
| xargs <b>-0</b> git checkout HEAD --
# or
| git checkout-index --stdin <b>-z</b>
sed
命令来引用文件名:git diff -b --numstat | egrep $'^0\t0\t' | cut -d$'\t' -f3- | sed -E 's/(.+)/"\1"/' | xargs git checkout HEAD --
- thenickdude虽然看起来你最初在寻找基于管道的解决方案,并从@aristotle-pagaltzis那里得到了,但由于有点难记,我认为这个替代方案值得注意:
git diff -b > gitdiffb
git stash # or git reset --hard if you feel confident
git apply --ignore-space-change gitdiffb
如果不仅要忽略空白数字的变化,还要忽略全新或完全删除的空格,那么将-b
替换为-w
。
与基于管道的解决方案相比,其结果在删除包含相关更改的文件中的空格变化时有所不同。 因此,它并不完全符合您描述的方式,但对于大多数通过搜索引擎进入此处的人,可能更希望看到这种方法。
cd /mnt/c
。cd repos/my-project
git diff -b --numstat \
| egrep $'^0\t0\t' \
| cut -d$'\t' -f3- \
| xargs git checkout HEAD --
如果你对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 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
或首先复制到备份文件夹来保存更改的副本。
git checkout
,而不是git reset
。 - Cascabel