Изменение строки в одной строке, поставленное Далвичем, показывает каждую строку по-разному

У меня есть файл с изменением в одну строку: 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...

Я хочу иметь возможность использовать Далвич для управления постановкой и коммитами. Так что внутри простоя, после 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 команда, я получаю отчет 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(-)

и он сообщает, что одна строка изменилась. Так что это проблема конца строки. Но мне нужно, чтобы операции Дульвича были взаимозаменяемыми с операциями командной строки. Как мне сказать Далвич Repo.stage() обращаться с окончаниями строк git add делает?

Я пытался с помощью porcelain.add() вместо Repo.stage()

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

но это не помогло никому.

2 ответа

Решение

Из кода в dulwich.index.blob_from_path_and_stat() похоже, что Далвич не обращает внимания на core.autocrlf настройка и не обращает внимания на что-либо в .gitattributes файл и просто записывает побайтную копию всего, что находится в файле рабочего каталога, в базу данных Git.

Таким образом, Dulwich 0.19.5 и Windows не очень подходят, если ваша команда также будет использовать другие инструменты, которые знают о политиках окончания строки и применяют их так же, как это делает Git. Более поздняя версия вполне может решить эту проблему, но пока это нефть и вода.

Будучи новичком в Git, я обнаружил, что Mind конец вашей строки Тимом Клемом из GitHub - самое ясное объяснение дюжины или около того, что я прочитал, пытаясь понять проблему и решить ее.

Вы можете контролировать окончания строк, задавая правила в .gitattributes файл - см. больше на https://git-scm.com/docs/gitattributes

Я всегда использую один со следующим содержимым всякий раз, когда я создаю новый исходный репозиторий:

* text=auto

потому что введение его позже сопряжено с некоторыми трудностями, особенно когда ваш репозиторий используется совместно с командой - поскольку он изменяет все (или большинство) файлов, и, кроме того, это изменение появляется после новой проверки, а не в текущей рабочей копии.

Чтобы минимизировать эту боль, вы можете указать, что она влияет только на ваше расширение.

Другие вопросы по тегам