我可以让Mac,Windows和Linux共享git repo而不会结束恐怖行为吗?

时间:2017-06-23 16:24:35

标签: linux windows git macos cross-platform

好的大家:我正在为研究人员建立一个git存储库,以共享研究项目的脚本和数据。研究人员不是程序员或特别熟悉的,所以我希望将桌面git客户端指向共享存储库 - 每个人都可以在本地文件系统中访问它。

问题:行结尾。我们有人使用:

  • Windows(主要是R)(CRLF)
  • linux和Mac脚本(主要是R和python)(仅限LF)
  • Mac上的Excel,保存为.CSV(仅CR,是的,这是实际的事情)
由于某种原因,git的autocrlf不了解Mac系列结尾,因此对我来说效果不佳。

首先,我想跟踪对这些文件的更改,而不是告诉别人"您无法使用您熟悉的工具"因为那时他们只会将数据和脚本存储在仓库之外的某个地方。

其次,我想让git repo没有充满愚蠢的行结束提交和合并冲突,因为我可能需要解决发生的所有合并冲突。

第三,我希望人们不必手动运行一些"修复所有的行结尾"脚本,因为那会很糟糕。如果这是我需要做的......无论如何,我想。

假设"首先,将行结束标准化"是答案,任何我应该选择哪种感觉?

我考虑过预提交挂钩,但听起来这会涉及以某种方式让同一个脚本在Windows和unix上运行,这听起来很糟糕。也许这是一个秘密实用的选择?

感谢。

1 个答案:

答案 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混淆),您可以定义名为cleansmudge您自己的过滤器,这可以做任意事情。这意味着您可以定义一个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...是很困难的,即使你能把这个词告诉 每个人