我们的团队有人在 Mac 和 Windows 上工作。到目前为止,我们已将 git 自动行结束设置为true(在 OSX 上)和input(在 Windows 上)。它工作得很好,除非存在合并冲突。在这种情况下,SourceTree 和 GitKraken 都会搞乱 Windows 上的合并,因为它们将所有以 LF 结尾的行视为一行。
我们所有人都应该使用相同的值core.autocrlf(在这种情况下是哪个?)还是针对特定应用程序有一些修复?
注意:目前,当行尾混乱时,我们会进行手动合并,但这很痛苦。另外,设置core.autocrlf为false也不是一个选项,因为配置文件中的错误行结尾会导致 Linux 上的构建崩溃。
我们的开发人员之一的文本编辑器弄乱了 PHP 文件的行结尾。我们已经尝试了所有设置,但编辑器似乎仍然在保存时用 LF 替换 CR-LF。
当然,最明智的做法是用一个像样的编辑器替换编辑器,但我想:为什么不配置 Git 来处理行结尾的差异呢?这就是我陷入困境的地方;我无法让它正常工作,我需要你的建议。
我们检查的文件似乎有 CR-LF 行结尾。当我们的开发人员编辑它们并存储它们时,它们同样具有 LF 结尾。提交文件时,不仅行会更改,而且每一行都会被删除并再次插入。
我已经设置core.autocrlf为true. 提交时,我收到一条警告,所有 LF 将被 CR-LF 替换。该文件将在您的工作目录中具有原始结尾。但是,所有行仍然被删除并再次添加。当与另一个分支合并时,这会产生冲突。
我尝试使用 制作.gitattributes文件*.php text。与 相同的结果core.autocrlf。
所以我的问题是:有没有一种方法可以将 Git 配置为仅提交程序员所做的更改,而保留仅行结尾发生更改的行?
今天,我遇到了一个有趣的问题,即使在使用相同配置的情况下,我的测试在构建机器上也能正常运行时,在构建机器上始终无法通过测试。当我查看故障转储中Assert.AreEqual输出的差异时,看不到任何差异。经过一番调查,我发现测试用例源代码中的逐字字符串(跨越多行)在我的计算机上使用CRLF,但在构建计算机上使用LF,导致该字符串与生成的字符串进行比较字符串失败。罪魁祸首是两个系统上的Git设置不一致,构建系统会自动将CRLF序列转换为LF。
C#规范是否说明了应如何解释逐字字符串中的换行符(也许使用Environment.Newline或至少是一些一致的东西)?这似乎是一个问题,可能会以非常难以诊断和解决的方式(特别是使用.NET Standard)咬伤很多人。例如,如果您有一个.NET Standard项目,并且在Linux和Windows上都有团队成员,则这很可能会伤及Linux团队成员或Windows团队成员。
我刚刚安装了最新的Git(1.9.5),突然它告诉我我的工作树不干净(更改没有上演),但我看不到任何差异工具中任何文件的任何变化(我尝试过Tortoise和Visual Studio的内置功能).当我运行git status时,它说:
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: inc/i_lab_orders.asp
modified: lab_order_list.asp
modified: slib/lab_order_lib.asp
Run Code Online (Sandbox Code Playgroud)
但是,Git GUI的diff工具告诉我所有的行都被改变了,但是我找不到任何区别.与git bash的差异相同.
运行git reset --hard根本没有帮助 - 命令执行没有任何问题,但最后我仍然有相同的"已更改"文件.
更新:core.autocrlf为false,core.fileMode也为false.我还注意到,报告要更改的文件正是在上次提交时提交的文件.
我在Windows上.
我和我的同事正在开发一个Android项目,他最近在https://github.com上设置了一个GitHub回购 .在我的最后,我在我的64位Windows 7机器上下载并安装了GitHub for Windows.然后我继续前往GitHub上的回购并使用"在Windows中克隆"按钮克隆项目.
一切似乎顺利进行,项目进展顺利
C:\Android\git-repos\OurProject
Run Code Online (Sandbox Code Playgroud)
在我的机器上.然后我对文件进行了一些更改
C:\Android\git-repos\OurProject\Host\Android\src\com\ourproject\client\SettingsActivity.java
Run Code Online (Sandbox Code Playgroud)
然后我观察到更改的文件(以及一些更改的构建文件)确实显示在我的机器上的GitHub版本上,就像这样

我选择了' SettingsActivity.java'文件,填写了一个简短的描述并点击' Commit'按钮.然后我看到了以下屏幕

然后,当我点击'同步'时

希望我所做的更改将被推回到主仓库,我得到以下消息
unstaged changes
You cannot sync with unstaged changes. Please commit your changes and try again.
Run Code Online (Sandbox Code Playgroud)
为什么我收到此错误消息?
我确实看过这个帖子
而且似乎必须执行以下步骤
但是从这个线程
可能看起来"同步"按钮会全部三个?所以,我不确定如何准确地提交我的提交.我认为我已经提交了我的更改(在上一步中)意味着我已经将它们上演了,这就是提供同步选项的原因.任何帮助解决这个问题都将非常感激.
PS:我也联系了GitHub支持团队,并在下面发布了他们的解决方案.
我的问题可能来自于对 Git 某些方面的误解。当我因 Windows 机器上的更改而在 Mac 上将 CRLF 更改为 LF 行结尾时,我想到了这个问题。
1) 我首先在 OSX 上初始化一个新存储库,并将所有文件放入受 CRLF 行结尾影响的文件中。
2)第一次提交,由于设置了 core.autocrlf = input ,git 自动将行结尾更改为 LF
我的本地工作树中的文件仍然具有 CRLF 行结尾,但这里也提供了解决方案(How to Normalizeworking tree lineendings in Git?):
删除Index中的文件,并根据上次commit恢复索引+工作树:
git rm --cached -r .
git reset --hard
Run Code Online (Sandbox Code Playgroud)
现在出现了混乱:我的第一个提交 1) 包含转换后的 LF 行结尾,而我的本地树和索引则不包含。因此,我的期望是 git 应该显示工作树/索引和存储库之间的差异。但
git diff HEAD
git diff --chached
Run Code Online (Sandbox Code Playgroud)
没有列出任何更改?
可能的重复:
git 最好的 CRLF 处理策略是什么?
我目前正在做一个项目,几乎每次我将 master 合并到我的分支时,我都会遇到合并冲突,git 说整个文件都已更改。通常,当我使用 Notepad++ 的比较工具比较这些文件时,它会报告实际上只有几行发生了更改,而且通常甚至不应该导致冲突。
有一段时间我只是把这种行为作为一个在跨平台工作时必须遇到的问题(我们的团队使用 Windows 7、OSX 和 debian 的混合进行开发),但是今天当我合并时,有一些阻碍我前进的严重问题。我自己研究过这个问题,似乎它可能与 git core.autocrlf 配置有关,但我不确定如何解决这个问题,以便它立即消失,或者随着 git 修复损坏而慢慢消失我以前做过。任何人都可以就如何解决这个问题提出任何建议吗?
谢谢,
亚历克斯