带有.gitattributes设置的Catch-22和repo

时间:2018-05-31 04:23:57

标签: git line-endings git-config gitattributes

由于我使用的第三方库存在一些问题,我要求永远不要为我的Git存储库自动转换行结尾。要求我推送或拉出的任何代码都具有存储在我的工作区和远程中的相同行结尾(即<CR><LF><LF>两者应始终保持不变。)

以下Git配置允许:

core.autocrlf false

为了减少开发人员之间的环境依赖性,我决定使用.gitattributes文件来配置它,如this answer

中所述
* text=false

我遇到的问题是新机器上repo的初始克隆。由于行结束配置选项现在位于repo本身,因此初始克隆使用本地环境的全局行结束配置。因此,如果特定用户的全局配置如下:

core.autocrlf true

这意味着具有Unix样式行结尾的文件如下:

This file has<LF>
Unix style line endings.<LF>

最终将在工作区中结束:

This file has<CR><LF>
Unix style line endings.<CR><LF>

这似乎是一个捕获22的情况,因为它无法应用.gitattributes设置,直到它克隆了回购。在那个阶段,为时已晚。

显而易见的解决方案是确保所有用户都具有以下全局配置值:

core.autocrlf false

但是,这完全违背了使用.gitattributes的目的。

这有什么好办法吗?

1 个答案:

答案 0 :(得分:1)

一个可能的缓解方法是在你的repo中修改一个脚本,这个脚本应该在开发者克隆了repo后运行(如同一个repo的README中所述)

该脚本将:

  • 执行git config --global core.autocrlf false
  • 重置索引,触发eol规范化as I detailed here

您可以将它与服务器端的预接收挂钩(假设您推送到托管服务器的私有存储库)耦合,这将拒绝任何错误的eol推送。