Проблема
Я пытаюсь совершить некоторые изменения, но они остаются позади, для причины, которые я не понимаю:
Я смотрю текущее состояние репо:
% 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
, итоговый индекс будет зафиксирован.