删除"文件末尾没有换行符#34;从git阶段改变

时间:2014-08-14 21:31:18

标签: git sed newline

我在一个大型代码库上执行了一个sed搜索/替换,并且对于每个传过来的文件,如果以前没有,那么它会在最后添加一个换行符。虽然以\ n结束最后一行是一个很好的惯例,但这是一个巨大的差异,与我试图完成的事情无关。该更改影响了数百个文件,我不想亲自手动检查和git checkout

有没有办法有选择地添加或删除暂存的更改,以便文件末尾只有"没有换行符的文件"会被忽略吗?

2 个答案:

答案 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处放弃换行符。