我在一个大型代码库上执行了一个sed搜索/替换,并且对于每个传过来的文件,如果以前没有,那么它会在最后添加一个换行符。虽然以\ n结束最后一行是一个很好的惯例,但这是一个巨大的差异,与我试图完成的事情无关。该更改影响了数百个文件,我不想亲自手动检查和git checkout
。
有没有办法有选择地添加或删除暂存的更改,以便文件末尾只有"没有换行符的文件"会被忽略吗?
答案 0 :(得分:6)
从链接的相关问题中,我发现git diff --ignore-all-space
会忽略只有空格更改的文件。 git diff --ignore-all-space --name-only
并不像我预期的那样工作,但确实如此:
git diff --ignore-all-space | grep "+++"
这给了我一个除了空格之外有其他变化的文件列表,这个文件足够小,我可以手动将它们全部添加到舞台上并提交。
感谢大家的评论,他们非常乐于助人。
答案 1 :(得分:0)
我所做的工作与@BenMorris的解决方案有所不同,该解决方案可以找到仅具有空白且没有其他更改的文件。即使同一个文件中还有其他有效的更改,我也想放弃EOF换行符更改:
要获取具有此类差异的文件列表:
git diff | grep '\(+++\|No newline at\)' | grep -B 1 'No newline at'
...或者如果您的grep支持它,这将清理输出以仅提供路径:
git diff | grep '\(+++\|No newline at\)' | grep -B 1 'No newline at' | grep --perl-regexp -o '\+\+\+ b/\K.*'
仅将您指向要手动清理的文件,而使其余过程自动化……就足够了。
如果没有安装,请下载并安装splitpatch.rb
使用EOF换行符更改对所有文件中所有已暂存的更改进行完整修补。 (这包括几个grep -v,以避免git和splitpatch的输出之间的兼容性出现小问题。)
git diff --cached | grep '\(+++\|No newline at\)' | grep -B 1 'No newline at' | grep -Po '\+\+\+ b/\K.*' | xargs git diff --cached | grep -v "^diff --git a" | grep -v "^index " > fullpatch.patch
将其分解为大块:
/path/to/splitpatch.rb --hunk fullpatch.patch
这将从000开始创建名为Filename.extention.00#.patch的独立编号文件。相反,仅对每个源文件应用最后一个(编号最高的)补丁(以下行仅适用于bash,不支持bash) zsh,由于存在差异):
for f0 in *.000.patch; do (for f_all in ${f0/000/*}; do echo $f_all; done) | tail -n -1; done | xargs -n 1 git apply —reverse
与EOF换行符在同一块内出现“真正的”更改并非不可能,因此请查看git diff
并使用编辑器撤消除最后一行之外的所有更改。
清理:
ls *.patch
rm *.patch
将这些小的反向更改添加到索引时,您将在EOF处放弃换行符。