如何在Git GUI中逐行暂存,即使出现“文件末尾没有换行符”的警告。

5
我使用git gui来选择要提交的行。这通常非常有效。我知道在命令行上也有同样的选项。
每当文件一开始没有文件末尾的换行符时,git gui会识别出来并在编辑器中附加一个警告消息,如我在截图中所示。

Git Gui

问题

由于缺少换行符而导致的问题是,无法再将单个行进行分阶段和提交。当我右键单击选择特定行并从上下文菜单中选择将行暂存以供提交时,会弹出错误消息。

error: fatal: corrupt parch at line 11.

该问题不限于操作系统,并且可以在Windows、MacOSX和Linux上重现。我知道如果我在继续选择单个行之前向文件添加一个新行并提交此版本,则可以避免出现问题。

复制问题的步骤

  1. 初始化新存储库。
  2. 创建一个具有三行内容的文件,每行都有单词“Hallo”。不要在文件结尾处放置换行符。
  3. 添加并提交该文件。
  4. 编辑相同的文件,在三行之间放置单词。
  5. 打开git gui,逐行尝试暂存更改。

请求

我想知道是否有Git的某些配置可以让我规避这个问题。一些自动化机制,如钩子,可以添加所需的新行也可以。

错误报告

我向Git邮件列表发送了一个错误报告。你可以在这里跟踪并参与讨论。


这实际上是针对git-gui的错误报告。这个问题只应该在文件的最后一个块中发生。发生的情况是,当你暂存行时,git-gui构建了一个补丁,然后通过“git apply”应用它。在这种情况下,我们需要删除最后一行,然后用一个换行符重新添加它,并将“\ No newline at end of file”标记作为上下文留下来。所有这些都发生在lib / diff.tcl apply_range_or_line中。这并不简单,但应该是可以修复的。 - patthoyts
我同意:如果在git gui中能够修复这个问题,那将是很好的。但是,我不知道其他UI工具是否也遇到了同样的问题。 - JJD
2个回答

5

感谢Heiko Voigt的帮助,解决了这个问题。我们在Git-Merge conference上修复了这个问题,感谢GitHub组织此次会议。该补丁目前正在邮件列表中等待处理。一旦合并并发布,我将在此更新此帖子。


最终,gitgui-0.18.0 已经合并到 git v1.8.4 中,并成为正式版本的一部分(2013年8月23日)。现在每个人都可以享受分步提交而不受文件末尾换行符的限制。再次感谢 Heiko!

@Ikraav 我想你是我注意到的第一个真正关心这个 bug 的人。尽管如此,我仍期待着 bug 修复版本的发布。 - JJD
我们目前正在进行一些(诚然有点过度)集中化的git操作,远程运行git gui以便各个用户提交他们的工作。这个问题已经让我们烦恼了一段时间。今天是个好日子,关于这个问题我就说这么多 :) - lkraav
@Ikraav,我很高兴能让你的一天变得美好 :) - JJD

3
我发现了一个可以解决问题的预提交钩子。虽然这不是完美的解决方案,因为修复操作直到你实际上提交文件之前才会应用。我创建了一个gist脚本,所以如果您想改进它,可以修改它。

原始脚本由Matt Baker发布。我将其简化为添加新行的事实,但还包括了删除尾随空格的例程。但是,关于换行符有一个变化:与Matt的建议相反,我添加了\n

问题情况:

我在git rebase工作流中使用了该脚本。这导致git更改了所有具有尾随空格的文件。结果是一个巨大的diff。因此,我建议考虑使用这个脚本。


此外,我发现这篇讨论如何将钩子集成到多个存储库中非常有趣。当设置自己的钩子时,您可能需要研究一下这个。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接