Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我能让Mac、Windows和linux共享一个git回购协议而不致于行尾恐惧吗?_Linux_Windows_Git_Macos_Cross Platform - Fatal编程技术网

我能让Mac、Windows和linux共享一个git回购协议而不致于行尾恐惧吗?

我能让Mac、Windows和linux共享一个git回购协议而不致于行尾恐惧吗?,linux,windows,git,macos,cross-platform,Linux,Windows,Git,Macos,Cross Platform,好的,各位:我正在为研究人员建立一个git存储库,以共享研究项目的脚本和数据。研究人员不是程序员,也不是特别精通git,所以我希望将桌面git客户端指向一个共享存储库——每个人都可以在本地文件系统中访问它 问题是:行尾。我们有人使用: 车窗(主要为右)(CRLF) linux和Mac脚本(主要是R和python)(仅限LF) Mac上的Excel,另存为.CSV(仅限CR,是的,这是一件实际的事情) git的autocrlf由于某种原因不理解Mac行的结尾,所以这对我来说不太合适 首先,我想

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

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

  • 车窗(主要为右)(CRLF)
  • linux和Mac脚本(主要是R和python)(仅限LF)
  • Mac上的Excel,另存为.CSV(仅限CR,是的,这是一件实际的事情)
git的autocrlf由于某种原因不理解Mac行的结尾,所以这对我来说不太合适

首先,我想跟踪对这些文件的更改,而不告诉人们“你不能使用你熟悉的工具”,因为这样他们只会将数据和脚本存储在repo之外的某个地方

第二,我希望git回购不会充满愚蠢的行尾提交和合并冲突,因为我可能需要解决所有发生的合并冲突

第三,我希望人们不必手动运行一些“修复所有行尾”脚本,因为那样会很糟糕。如果这是我需要做的。。。不管怎样,我想

假设“首先,规范化行尾”是答案,我应该选择哪一种

我曾考虑过一个预提交钩子,但听起来好像这需要在Windows和unix上运行相同的脚本,这听起来很糟糕。也许这是一个秘密的实际选择

谢谢。

您可能至少需要编写一点点代码

其次,为了更清楚一点,以下是Git本身如何处理或不处理数据转换:

  • 提交中的数据(文件)是神圣不可侵犯的。它实际上是无法更改的,所以一旦某个内容在提交中,它就是永久的。1

  • 工作树中的数据可以而且应该是“主机友好”格式。也就是说,如果您在Mac上运行Pmac程序,该程序要求行以CR结尾,则数据可以采用该格式。如果您在一个运行等效Pwindows的Windows框上,该Pwindows要求行以CR+LF结尾,那么数据可以是该格式

  • 当文件从索引/暂存区域移动到工作树时,会发生到“主机格式”的转换。当文件从工作树移动到索引/暂存区域时,会发生从“主机格式”到“内部存储格式”的转换

大多数Git的内置过滤器只进行CRLF到LF或LF到CRLF的转换。有一个“更大”的内置过滤器,名为
ident
(不要与
indent
混淆),您可以定义自己的过滤器,名为
clean
smudge
,它们可以执行任意操作。这意味着您可以定义一个
smudge
过滤器,该过滤器在Mac上(而不是在Windows上)将(例如)将LF更改为CR。相应的Mac only
clean
过滤器可能随后将CR更改为LF

请注意,许多转换并不是在原始二进制数据上保留数据:可能有一个字节恰好类似于LF或CR,或者一行中有两个字节类似于CRLF,但并不意味着要以这种方式进行解释。如果更改这些,就会破坏二进制数据。因此,重要的是只对那些看起来像是这些东西之一的字节实际上是这些东西之一的文件应用过滤。您可以使用
.gittributes
路径名匹配,例如
*.suffix
,来推断哪些文件应用了哪些过滤器

当然,要应用的正确过滤操作将取决于主机

合并和“重新规范化” 在进行合并时,Git通常只直接从每个涉及的提交中的纯版本获取文件。由于是Git(和
Git diff
)对行进行解释,因此您通常希望这些行具有Git首选的“行”格式,即以LF结尾(如果它们在LF之前有或没有CR,则可以,只要馈入三向合并的所有三个版本在LF之前都具有相同的CR)。不过,您可以使用“renormalize”设置,让Git在执行三向合并之前虚拟地通过污迹,然后清除过滤器。只有当您现在打算合并的现有提交(基本提交和两个分支提示)以不同于您现在同意保留在永久提交中的方式存储时,您才需要此功能。(我实际上没有尝试过任何一种方法,但原理非常简单。)



1您可以删除提交,但要执行此操作,还必须删除该提交的所有子代。在实践中,这意味着已共享/推送的提交通常不会消失;只有私有提交才能消失,或者被新的和改进的提交所取代。很难让每个提交过a9f3c34…的人放弃它,转而使用新的和改进的
07115c3…
,即使你可以把这个词传达给每个人。

autocrlf应该适用于文本文件。对于Excel,我认为它是不同的故事,因为它是二进制格式,它可能不会对此类文件产生影响。事实上,这样做弊大于利。我编辑了这篇文章以澄清:在Excel/Mac中,我们将数据保存为CSV;通过这种方式,我们可以得到带有CR行结尾的文本文件。您可以尝试探索另一个选项,它将使您能够在提交之前进行行结尾转换。但也许有人会想出更好的解决办法。谢谢——我已经编辑了这篇文章。我认为在windows和unix上有脚本语言的诀窍。是的,您可能需要在所有平台上使用相同的脚本语言—perl、python、node.js。或者只适用于Mac,因为autocrlf不起作用。并在linux和Windows上使用autocrlf。谢谢。我可以保证我不会推动任何事情,因为我们都将共享一份回购协议。每个人都可以