Git commit оставляет изменения в индексе

Проблема

Я пытаюсь совершить некоторые изменения, но они остаются позади, для причины, которые я не понимаю:

Я смотрю текущее состояние репо:

% git status
On branch new-master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   __init__.py
    new file:   api/__init__.py
    new file:   api/api.py
    new file:   api/common.py
    new file:   api/error.py

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:   ../status/server.py
    modified:   __init__.py

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    ../env/
    ../foo.db

Беспощадно, но то, что находится в индексе, - это то, что я хочу совершить. (Примечание: есть изменения, которые не были поставлены: я не заинтересован в их совершении. изменения в разделе "Изменения, которые необходимо совершить" - это изменения, которые я желаю совершенное.) Я фиксирую это:

% git commit -m "Why won't you commit?"
[new-master a4dbe36] Why won't you commit?

И сразу же заново запустите статус, чтобы убедиться, что ничего не изменилось:

% git status
On branch new-master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   __init__.py
    new file:   api/__init__.py
    new file:   api/api.py
    new file:   api/common.py
    new file:   api/error.py

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:   ../status/server.py
    modified:   __init__.py

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    ../env/
    ../foo.db

Если я посмотрю на последнюю фиксацию, мы увидим, что ничего не произошло:

% git log -n1 -p
commit a4dbe36e77a9f3b04c2ef33de75e28b6aa7cac0c
Author: Me <[email protected]>
Date:   Fri May 2 11:52:06 2014 -0700

    Why won't you commit?

Что здесь происходит? Почему эти изменения не совершены?

Минимальная тестовая версия!

mkdir bar && cd bar
git init
echo "data." > some_existing_file
git add some_existing_file
git commit -m "Initial commit."

Это просто настроено. Теперь для настоящей забавы. Я получаю фанковое поведение с --intent-to-add (я просто не понимаю, что он делает), но это воспроизводит моя полная проблема:

mkdir subdir && mkdir subdir/another
cd subdir
echo "foodata" > a_file
echo "more data" > another/other_data
git add --intent-to-add a_file
git add another/other_data

И затем попытайтесь зафиксировать:

git commit -m "Why isn't this committing anything?"

Потенциально использовать выходы

У меня нет пользовательских крючков (что я знаю):

% ls "`git rev-parse --git-dir`"/hooks
applypatch-msg.sample     pre-applypatch.sample     pre-rebase.sample
commit-msg.sample         pre-commit.sample         prepare-commit-msg.sample
post-update.sample        pre-push.sample           update.sample

Если это имеет значение, каталог, в который добавлены добавленные файлы, также является новым, и делает не существует в предшествующей фиксации. (Я был в самом каталоге, когда я побежал git status, см. .. в разделе "не поставленный для фиксации".)

git diff HEAD a4dbe36e77a, как запрошено, ничего не выводит.

git show:

% git show a4dbe36e77a
commit a4dbe36e77a9f3b04c2ef33de75e28b6aa7cac0c
Author: Me <[email protected]>
Date:   Fri May 2 11:52:06 2014 -0700

    Why won't you commit?

Также, в raw:

% git show --format=raw a4dbe36e77a
commit a4dbe36e77a9f3b04c2ef33de75e28b6aa7cac0c
tree ca9326ccba91dda7540198c082db6e6ab3fb097a
parent 1842d56d5a47ff33bd420a5014f208c85acc5a1f
author Me <[email protected]> 1399056726 -0700
committer Me <[email protected]> 1399056726 -0700

    Why won't you commit?

An ls-tree этого дерева:

% git ls-tree --full-tree ca9326ccba91dda7540198c082db6e6ab3fb097a
100644 blob fab05d167a3f8ef9ddf00d7af09e00eea03f1d28    requirements.txt
040000 tree 0d9742d9c1728495d600bde05a7f276f3c65d96d    status

Для краткости: git diff --staged показывает diff изменений: это diff, который я хочу совершить, но что git commit не совершает. (git diff --cached также показывает этот diff.) git commit -v также показывает этот diff, но ввод сообщения не приводит к фиксации.

Единственная странная вещь в этой ветке - это сиротская ветвь - master содержит WIP, но грязную версию этого кода. Я надеялся очистить его, но сохранить хозяина, потому что я человек, и беспокоюсь, что я что-то удалю. Однако это не первая фиксация. (Первая фиксация также имеет реальные изменения.) Только сейчас что-то пошло не так.

Потенциальная подсказка/что-то здесь не так:

EDIT @torek заставил меня запустить это:

% git write-tree
ca9326ccba91dda7540198c082db6e6ab3fb097a

Это должно превратить содержимое индекса в дерево (которое затем может быть привязано к объекту фиксации, и, таким образом, возникает фиксация). Однако этот хэш совпадает с HEAD. Учитывая, что в моем индексе есть изменения, можно было бы ожидать, что идентификатор дерева должен быть другим. В частности, эти команды показывают, что что-то нечетное:

% git write-tree
ca9326ccba91dda7540198c082db6e6ab3fb097a
% git diff --staged --stat
 wsgi_util/__init__.py     |  0
 wsgi_util/api/__init__.py |  0
 wsgi_util/api/api.py      | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 wsgi_util/api/common.py   | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 wsgi_util/api/error.py    | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 235 insertions(+)
% git write-tree
ca9326ccba91dda7540198c082db6e6ab3fb097a
% git show --format=raw HEAD
commit fe28d60c21e998104e5967faf7af3bf203cd4b26
tree ca9326ccba91dda7540198c082db6e6ab3fb097a
parent f86425decfcb3410d5bc90da6ce6146e04775953
author Me <[email protected]> 1399059521 -0700
committer Me <[email protected]> 1399059521 -0700

    What is going on here?

git ls-files -s, что кажется актуальным:

100644 fab05d167a3f8ef9ddf00d7af09e00eea03f1d28 0   requirements.txt
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0   status/__init__.py
100644 923b97d0d9e6c68e77751bb4e7fb14c41fa9d71a 0   status/api/__init__.py
100644 75f064fc9c170b56545c6b92958b38c10260beec 0   status/api/message.py
100644 07cf4dc004231945847e9f93e3de214dd02c3661 0   status/api/message_db.py
100644 78cda37dcc7a4b4f34089b2d843a9abfcd4118cf 0   status/server.py
100644 bee7c1eb7b92ccf6b78c7dfc5f36e71b77ec5792 0   status/util.py
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0   wsgi_util/__init__.py
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0   wsgi_util/api/__init__.py
100644 e92f248874be5beec7b18228d4bf0d062b508916 0   wsgi_util/api/api.py
100644 68a5a62034d52684222c7075f59f2927c1d8695e 0   wsgi_util/api/common.py
100644 28d9add6dae84ddab293e3a44cac4824f8d2d482 0   wsgi_util/api/error.py

Другой ключ?

Поскольку это значительно улучшилось, я сделал git reset --mixed HEAD. Затем я приступил к воссозданию индекса. Один из файлов wsgi_util/__init__.py не пуст, но я хочу зафиксировать его (пока) как пустой файл: там нет полезного кода. Для этого я до сих пор запускал git add --intent-to-add wsgi_util/__init__.py. Я не могу зафиксировать этот индекс.

Однако я обнаружил, что если вместо этого заменить его на пустой файл, а затем сделать нормальный git add, итоговый индекс будет зафиксирован.

Ответы

Ответ 1

В документации указывается это о -int-to-add

Record only the fact that the path will be added later. An entry for the path is placed in
the index with no content. This is useful for, among other things, showing the unstaged
content of such files with git diff and committing them with git commit -a

Вы можете прочитать для себя здесь. https://www.kernel.org/pub/software/scm/git/docs/git-add.html

Из моего понимания документации и экспериментирования я должен использовать git commit -a, чтобы добавить файлы.