Dulwich 进行的一行代码更改显示每一行都不同

One-line code change staged by Dulwich shows every line different

我有一个单行更改的文件:git status 报告

S:\mydir\AEL>git status CodingTools_SourceControl.ael
On branch master
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:   CodingTools_SourceControl.ael

no changes added to commit (use "git add" and/or "git commit -a")

这是 diff 报告的变化

S:\mydir\AEL>git diff CodingTools_SourceControl.ael
diff --git a/AEL/CodingTools_SourceControl.ael b/AEL/CodingTools_SourceControl.ael
index 7ae86d7..fd53caa 100644
--- a/AEL/CodingTools_SourceControl.ael
+++ b/AEL/CodingTools_SourceControl.ael
@@ -22,7 +22,7 @@ import ael
 import acm
 is_64_bit = True

-# Special-purpose overrides
+# Special-purpose overrides. These deliberately require minor code changes.
 #CodingTools_PyLint.VERBOSE = True
 #CodingTools_PyLint.PYLINTRC = "default.pylintrc"

现在我开始改变:

S:\mydir\AEL>git add CodingTools_SourceControl.ael

S:\mydir\AEL>git status CodingTools_SourceControl.ael
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   CodingTools_SourceControl.ael

如果我要求一份有关分阶段更改的报告,我会看到相同的单行更改:

S:\mydir\AEL>git diff --cached CodingTools_SourceControl.ael
diff --git a/AEL/CodingTools_SourceControl.ael b/AEL/CodingTools_SourceControl.ael
index 7ae86d7..fd53caa 100644
--- a/AEL/CodingTools_SourceControl.ael
+++ b/AEL/CodingTools_SourceControl.ael
@@ -22,7 +22,7 @@ import ael
 import acm
 is_64_bit = True

-# Special-purpose overrides
+# Special-purpose overrides. These deliberately require minor code changes.
 #CodingTools_PyLint.VERBOSE = True
 #CodingTools_PyLint.PYLINTRC = "default.pylintrc"

现在我取消暂存更改

S:\PrimeObjects\ADSO71\KEATING\AEL>git reset CodingTools_SourceControl.ael
Unstaged changes after reset:
M       AEL/ATS_SourceControl.ael
...several other unstaged changes...

我希望能够使用 Dulwich 来管理暂存和提交。所以在 Idle 中,在 reset 之后,我这样做:

>>> from dulwich.repo import Repo
>>> repo = Repo(br"S:\mydir")
>>> repo.stage([br"AEL\CodingTools_SourceControl.ael"])

在那之后,git status 显示更改已上演,就像之前一样

S:\mydir\AEL>git status CodingTools_SourceControl.ael
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   CodingTools_SourceControl.ael

但是如果我现在发出 git diff 命令,我会得到一份差异报告,其中显示文件的所有 1500 多行都已更改:

S:\mydir\AEL>git diff --cached --stat CodingTools_SourceControl.ael
 AEL/CodingTools_SourceControl.ael | 3082 ++++++++++++++++++-------------------
 1 file changed, 1541 insertions(+), 1541 deletions(-)

编辑: 根据@RomainVALERI 的有用评论,我尝试了这个命令

S:\mydir\AEL>git diff --cached --stat --ignore-cr-at-eol CodingTools_SourceControl.ael
 AEL/CodingTools_SourceControl.ael | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

它报告一行已更改。所以这是一个行结束问题。但我需要 Dulwich 操作可以与命令行操作互换。我如何告诉 Dulwich Repo.stage()git add 的方式处理行尾?

我尝试使用 porcelain.add() 而不是 Repo.stage()

porcelain.add(repo, r"S:\mydir\AEL\CodingTools_SourceControl.ael")

但没有任何帮助。

您可以通过在 .gitattributes 文件中指定规则来控制行尾 - 在 https://git-scm.com/docs/gitattributes

中查看更多信息

每当我创建一个新的源存储库时,我总是使用一个包含以下内容的:

* text=auto

因为,稍后引入它会带来一些痛苦,尤其是当您的存储库与团队共享时 - 因为它会更改所有(或大部分)文件,而且,此更改会在新签出后出现,而不是在当前工作中出现复制.

为了尽量减少这种痛苦,您可以指定它只影响您的扩展程序。

dulwich.index.blob_from_path_and_stat() 中的代码来看,Dulwich 似乎没有注意 core.autocrlf 设置,也没有注意 .gitattributes 文件中的任何内容,只是简单地写了一个 byte-for - 将工作目录文件中的任何内容复制到 Git 数据库。

所以 Dulwich 0.19.5 和 Windows 不是一个很好的匹配,如果你的团队也将使用其他了解行结束策略的工具并以 Git 的方式应用它们.以后的版本可能会很好地解决这个问题,但现在它是油和水。

作为一个 Git 初学者,我在 GitHub 上找到了 Tim Clem 的 Mind the end of your line,这是我在尝试理解问题和解决问题时阅读的十几个最清晰的解释问题。