Git空格/行尾符问题

4
我将为您提供一个简化版本的内容,让您了解当前情况。我尝试过不同的解决方案,但是我甚至不确定我的问题源自何处。
我对分支B进行了一些修改,该分支是上游存储库分支A的一个分支。然后,我尝试Pull Request以合并A和B。
在创建此PR时,出现了一些冲突,因此我尝试解决它们。但是,在尝试这样做时,我通过git diff意识到一些文件显示为所有行已删除并重新添加: @@ -977,16 +977,16 @@ p#splash-text span {
为了获得最小的示例,我中止了合并,然后从上游A中拉取到一个新分支C。
现在,我正在C分支上,如果我打开有问题的文件并保存而不进行修改,我会得到以下git diff结果:
@@ -977,16 +977,16 @@ p#splash-text span {

 .other div#carshare .box.active {
     background-color: green;
-}
-
-.other div#bluephone .box.active {
-    background-color: #2880ca;
-}
-
-.box_col {
-    vertical-align: middle;
-}
-
+}^M
+^M
+.other div#bluephone .box.active {^M
+    background-color: #2880ca;^M
+}^M
+^M
+.box_col {^M
+    vertical-align: middle;^M
+}^M
+^M
 .leaflet-control-locate a {
        padding: 3px 0px 0px 0px;
 }

我阅读了很多关于行尾的文章,发现'^M'是Windows放置的行尾符,但其他贡献者在Linux下工作,所以我对他最近的修改为什么在我的本地有'^M'感到有些困惑。

既然我在Linux上,我尝试了以下操作: git config --global core.autocrlf input 我还尝试将其设置为true,但没有解决我的问题。

其他贡献者没有设置autocrlf,所以这可能是问题所在?

现在,如果我进行小的修改,但运行git diff --ignore-space-at-eol,我会得到以下结果:

@@ -697,7 +697,7 @@ div#otp-planner-optionsWidget-scollPanel {
    padding:10px;
     }

    -.otp-layerView-inner fieldset { border-top:1px solid #000; }
    +.otp-layerView-inner fieldset { border-top:1px solid gray; }^M
     .otp-layerView-inner fieldset legend { text-align:center; }

我想提交并推送这个更改,但不希望任何行结尾也跟着改变。

有没有一种方法仅提交此单个更改,而不是由行结尾引入的所有更改?

或者如何不产生所有这些更改?

我阅读了git config的手册和其他关于空格的问题,但给出的解决方案似乎不起作用或不适用于我的情况。

如果你对如何解决这个问题并且避免将来出现类似问题有任何建议,请让我知道。


Github在这里有一篇关于处理“eol”的好文章:https://help.github.com/articles/dealing-with-line-endings/。看看这是否有帮助。 - tejasbubane
1个回答

2

如果要保持一致的unix换行符,.gitattributes文件可以帮助解决这个问题。

* text eol=lf

我建议将.gitattributes文件实际检入到您的仓库中,以便每个人都具有一致的行尾。

接下来,运行dos2unix实用程序对修改过的文件进行处理,以剥离Windows行尾:

dos2unix file.txt

最后,互动地将您的更改重新基于您想要贡献的分支,并强制推送以更新您的拉取请求:
git fetch
git rebase -i origin/A
git push -f origin C

谢谢。我读了关于.gitattribute的内容,并试图不使用它,因为我们没有这个文件,我必须在推送之前解决这个问题。你能详细说明dos2unix是做什么的吗?它只是将Windows行结束符转换为Linux行结束符吗?好答案,顺便说一下。 - user1527152
1
@user1527152 对的,dos2unix 可以将行尾转换。 - Jonathan.Brink
请注意,* text eol=lf 可能会对非文本文件产生意想不到的影响。(我刚刚发现了这一点。)我的解决方案是为每种类型的文件设置一个类似于 *.pvs text eol=lf*.txt text eol=lf 的模式,以便让它将其视为文本文件。 - Ben Hocking

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接