Файл не попадает в фиксацию после использования git add -N

Я хочу зафиксировать файл Python modules __init__.py, который на моем диске уже содержит код. Однако для текущего фиксации я хотел добавить его пустым, так как эта часть кода еще не тестировалась. Таким образом, я использовал

$ git add -N __init__.py

Файл находится на выходе git status, но если я выдаю git commit, все остальные файлы попадают в коммит, кроме __init__.py, который, в свою очередь, остается в индексе в соответствии с git status.

Страница руководства git-add говорит для -N, что

Record only the fact that the path will be added later. An entry for the path is placed in the index with no content.

Есть ли способ обойти эту часть will be added later, т.е. добавить файл пустым, не временно удалив его содержимое?

Изменить: Это происходит с текущим (2.2.0) Git. С 1.7.1 и небольшим тестовым репо я получаю сообщение об ошибке:

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   b
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   b
#
$ git commit -m 'test'
b: not added yet
error: Error building trees

Ответ 1

Это должно быть исправлено с помощью Git 2.5 (Q2 2015), то есть git commit не будет пытаться включить новый файл, "предназначенный для добавления позже".
См. совершить d95d728 от Nguyễn Thái Ngọc Duy (pclouds) (объединено в d0c692263)

diff-lib.c: отрегулируйте положение записей i-t-a в diff

Проблема:

Записи, добавленные "git add -N" , являются напоминанием для пользователя, поэтому они не забывают добавлять их перед фиксацией. Эти записи появляются в индексе, даже если они не являются реальными.
Их присутствие в индексе приводит к запутанному "git status" следующим образом:

On branch master
Changes to be committed:
        new file:   foo

Changes not staged for commit:
        modified:   foo

Если вы выполните "git commit", "foo" не будет включен, хотя "status" сообщает об этом как "to be committed".

Решение:

Этот патч изменяет результат на

On branch master
Changes not staged for commit:
        new file:   foo

no changes added to commit

Другими словами:

  • Относитесь к таким путям, которые "еще не добавлены в индекс, но Git уже знают о них";
  • "git diff HEAD" и "git diff --cached HEAD" не должны говорить о них, а
  • "git diff" должен показать их как новые файлы, которые еще не добавлены в индекс.

Обновление Q4 2016:

commit: исправить пустое создание фиксации, когда нет изменений, кроме ita записей

(ita или i-t-a означает "намерение добавить" )

См. commit 2c49f7f, зафиксировать 018ec3c, commit b42b451, commit 425a28e (24 октября 2016 г.) Nguyễn Thái Ngọc Duy (pclouds).
(объединено Junio ​​C Hamano - gitster - в commit 6503602, 27 октября 2016 г.

Когда новые индексы добавлялись к индексу "git add -N" , этого было достаточно, чтобы обойти проверку "git commit", чтобы воздерживаться от создания пустой фиксации без "--allow-empty".
Эта же логика не позволила "git status" показать такой путь, как "new file" в разделе "Changes not staged for commit".

git diff справочная страница теперь включает в себя:

--ita-invisible-in-index:

По умолчанию записи, добавленные "git add -N" , отображаются в виде существующего пустого файла в "git diff" и новый файл в "git diff --cached".
Этот параметр делает запись в виде нового файла в "git diff" и не существует в "git diff --cached".

Этот параметр можно вернуть с помощью --ita-visible-in-index.

Оба варианта являются экспериментальными и могут быть удалены в будущем.


Обновление Q1 2018 (Git 2.16.x/2.17), git status снова улучшается.
"git status" , после перемещения пути в рабочем дереве (следовательно, он появляется "удален" ), а затем добавляется с опцией -N (следовательно, что "добавлено" ) обнаружило его как переименование, но не правильно сообщать старые и новые пути.

См. commit 176ea74, commit 5134ccd, commit ea56f97, commit 98bc94e, commit 06dba2b, зафиксировать 6de5aaf (27 декабря 2017 г.) Nguyễn Thái Ngọc Duy (pclouds).
Помощник: Игорь Джорджевич (boogisha).
(слияние Junio ​​C Hamano - gitster - в commit bc3dca0, 23 января 2018 года)

Примечание: i-t-a или ita "предназначено для добавления".

wt-status.c: переименовать рабочие тэги

До 425a28e (diff-lib: разрешить записи ita как "еще не существует" в индексе "- 2016-10-24, Git 2.11.0-rc0) в индексе никогда нет" новых файлов ", что существенно отключает обнаружение переименования, потому что мы обнаруживаем только переименования, когда новый файл появляется в паре различий.

После этой фиксации запись i-t-a может появиться в виде нового файла в" git diff-files".
Но функция обратного вызова diff в wt-status.c не обрабатывает этот случай и производит неправильный вывод состояния.