2009-12-07 3 views
2

Я получаю неожиданный внешний вид «dev/null» на выходе git status после интерактивного добавления патча для файла, который был переименован. Мне интересно, ожидалось ли это, и есть какая-то веская причина для этого поведения, или если это может быть ошибкой.Почему git показывает «dev/null» в статусе после интерактивного добавления переименованного файла?

Ниже приведена простая иллюстрация о том, как воспроизвести это. В моей реальной ситуации, это немного более сложным, и есть хорошая причина, почему я использую git add -p, но я был в состоянии варить до этого минимального примера:

 
$ git init test 
Initialized empty Git repository in /local_disk/tmp/test/.git/ 
$ cd test 
$ echo "foo" > foo 
$ git add foo 
$ git commit -m 'Add foo' 
[master (root-commit) 3643b5d] Add foo 
1 files changed, 1 insertions(+), 0 deletions(-) 
create mode 100644 foo 
$ mv foo bar 
$ git add -p 
diff --git a/foo b/foo 
index 257cc56..0000000 
--- a/foo 
+++ /dev/null 
@@ -1 +0,0 @@ 
-foo 
Stage this hunk [y,n,q,a,d,/,e,?]? y 

$ git status 
# On branch master 
# Changes to be committed: 
# (use "git reset HEAD ..." to unstage) 
# 
#  new file: dev/null 
#  deleted: foo 
# 
# Changed but not updated: 
# (use "git add/rm ..." to update what will be committed) 
# (use "git checkout -- ..." to discard changes in working directory) 
# 
#  deleted: dev/null 
# 
# Untracked files: 
# (use "git add ..." to include in what will be committed) 
# 
#  bar 

Что такое с «новым файл: dev/null "и" удаленный файл: dev/null "? Я бы ожидать, что это приведет к точно то же самое, как если бы я сделал:

 
$ mv foo bar 
$ git rm foo 
$ git status 
# On branch master 
# Changes to be committed: 
# (use "git reset HEAD ..." to unstage) 
# 
#  deleted: foo 
# 
# Untracked files: 
# (use "git add ..." to include in what will be committed) 
# 
#  bar 

Я использую Git версии 1.6.5.5, а также воспроизводить его в 1.6.5.4. Я не смог воспроизвести его в моей среде Cygwin, которая имеет Git в версии 1.6.1.2.

+0

какая версия git? Я не могу повторить это поведение. Вместо этого git add -p после ответа git mv: никаких изменений –

+0

@William: Использование 'git mv' не эквивалентно, потому что оно перемещается и добавляет файл в одно и то же время. Я перемещаю файл, используя просто «mv», а затем с помощью 'git add -p', чтобы добавить его. –

+0

@ Дана, почему? 'git mv' - это« правильный »способ изменить имя файла. Чтобы удалить файл, который вы используете 'git rm', и чтобы переместить его, вы используете' git mv', не просто переместите файл самостоятельно и ожидайте, что git прочитает ваши мысли :) – rfunduk

ответ

1

Как упоминается далее, вы не должны пытаться удалить файл git add. git add новый файл, git rm старый файл (или git mv old new, чтобы принять простой подход). С другой стороны, git должен либо жаловаться на то, что вы делаете, либо не путаться, и пытаться добавить несуществующий файл dev/null.

Update
git add -p действительно действительный метод стадии абсорбции файлов, но это выглядит как ошибка была введена git apply при креплении другого git applybug.

Update
я могу воспроизвести его на Linux с 1.6.1.2, так что это может быть, что Cygwin мерзавец является то, что отличается от нормального поведения. В этом случае ранее упомянутое исправление ошибок может не вводить это поведение, и рабочий git add -p может быть специфичным для git cygwin. Я пытался делить пополам, чтобы найти, где git add -p начал сбой.

Update
Оказывается, это была скорее ошибка в интерактивном аспекте git add который Джефф Кинг предложившего patches для.

+0

Как я уже сказал в своем вопросе, это упрощенный пример «спящего».В моем реальном сценарии «git add -p» использовался, потому что он немного сложнее (некоторые изменения я хочу поставить, а некоторые нет). Git обычно позволяет «удалять» контент с помощью 'git add -p'. 'git rm' не * требуется *, чтобы сделать это, это просто удобный способ сообщить git, что вы хотите« добавить удаление »файла (уже не существующего) в индекс. Если это было некорректно, тогда git add -p' ** не предлагал ** создавать патчи, удаляющие контент. –

+0

Положите другой способ, допустим, у меня есть 100 файлов, которые я удалил, но я хочу только удалить 50 из них. 'git add -p' был бы очень удобным способом быстро сказать 'y'/'n' и просмотреть список файлов, чтобы выбрать, какие удаления должны быть поставлены для фиксации. –

+0

'git rm' необходим для удаления файла сцены. Вы можете проверить это, пытаясь сделать git add deletedFile'. Ничего не произошло. Вот почему я говорю, что 'git add -p' должен жаловаться или ничего не делать, когда вы используете его для установки удаления файла. 'git mv' - действительно удобная команда, но' git rm' - нет. – jamessan