好的大家:我正在为研究人员建立一个git存储库,以共享研究项目的脚本和数据。研究人员不是程序员或特别熟悉的,所以我希望将桌面git客户端指向共享存储库 - 每个人都可以在本地文件系统中访问它。
问题:行结尾。我们有人使用:
首先,我想跟踪对这些文件的更改,而不是告诉别人"您无法使用您熟悉的工具"因为那时他们只会将数据和脚本存储在仓库之外的某个地方。
其次,我想让git repo没有充满愚蠢的行结束提交和合并冲突,因为我可能需要解决发生的所有合并冲突。
第三,我希望人们不必手动运行一些"修复所有的行结尾"脚本,因为那会很糟糕。如果这是我需要做的......无论如何,我想。
假设"首先,将行结束标准化"是答案,任何我应该选择哪种感觉?
我考虑过预提交挂钩,但听起来这会涉及以某种方式让同一个脚本在Windows和unix上运行,这听起来很糟糕。也许这是一个秘密实用的选择?
感谢。
答案 0 :(得分:0)
作为Marek Vitek said in comments,您可能需要编写至少一小部分代码。
其次,为了清楚起见,这里有Git本身如何处理 - 或者不处理数据转换:
提交内的数据(文件)是神圣不可侵犯的。字面上可以更改,所以一旦提交内容,它就会永远。 1
工作树中的数据可以而且应该在"主机友好"格式。也就是说,如果您在运行程序 P mac 的Mac上需要以 CR 结尾的行,那么数据可以在那种格式。如果您在运行等效 P windows 的Windows框中,该行需要以 CR + LF 结尾,则数据可以是以那种格式。
转换为"主机格式"当文件从索引/临时区域移动到工作树时发生。来自"主机格式"的转换到"内部存储格式"当文件从工作树移动到索引/暂存区域时发生。
大多数Git内置的过滤器只能进行CRLF到LF或LF到CRLF的转换。有一个更大的"内置过滤器,名为ident
(不要与indent
混淆),您可以定义名为clean
和smudge
的您自己的过滤器,这可以做任意事情。这意味着您可以定义一个smudge
过滤器,在Mac上(但不在Windows上)将(例如)将LF更改为CR。相应的仅限Mac的clean
过滤器可能会将CR更改为LF。
请注意,许多转换不是在原始二进制数据上保留数据:可能有一个字节恰好类似于LF或CR,或者类似于CRLF的两行,但并不意味着解释那样。如果更改这些,则会破坏二进制数据。因此,将过滤仅应用于似乎的字节为其中之一的文件非常重要,实际上 是其中之一。您可以使用.gitattributes
路径名称匹配(例如*.suffix
)来推断哪些文件会应用哪些过滤器。
要应用的正确过滤操作当然取决于主机。
在进行合并时,Git通常直接从每个提交的提交中的纯版本中获取文件。由于它是Git(和git diff
)对行的解释,你通常希望这些都有Git的首选" line"格式,即以LF结尾(如果他们在LF之前有或没有CR,只要所有三个版本都进入三向合并都具有相同的 CR-before-LF-ness)。您可以使用"重新规范化"但是,设置Git会在进行三向合并之前通过涂抹然后清理的过滤器进行虚拟传递。只有当你想要合并的现有提交(基本和两个分支提示)以与你现在已经同意保留在永久提交中的方式不同的方式存储时,才需要这个。 (我实际上没有尝试过这个,但原理很简单。)
1 您可以删除提交,但为此,您还必须删除所有提交的后代。在实践中,这意味着已经共享/推送的提交,通常永远不会消失;只有私有提交可以消失或被新的和改进的提交替换。让所有提交a9f3c34...
的人放弃支持新的和改进的07115c3...
是很困难的,即使你能把这个词告诉 每个人