Как вы можете git добавить новый файл без его создания?
Чтобы эффективно использовать git (и, как предполагалось), я делаю небольшие атомные коммиты, в то время как у меня есть более длительные сеансы, где я изменяю не только одно. Таким образом, я сильно использую git add -p
. Однако это не работает для совершенно новых файлов, потому что я, как правило, забываю их позже.
Что я хочу сделать, скажите git
, что есть новый файл, я хочу, чтобы он отслеживал, но не выполнял его:
Пример: Запуск git status
вызывает:
# On branch my-current-branch
# Your branch is ahead of 'origin/my-current-branch' by 2 commits.
#
# Changes to be committed:
#
<<STAGED SECTION>> // A
#
# 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)
#
<<UNSTAGED-YET-KNOWN SECTION>> // B
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
<<UNKNOWN SECTION>> // C
Если у меня есть файл foo
в разделе C, и я говорю git add foo
, он перейдет к разделу A. Если я скажу git add -N foo
, он перейдет к A и B. Однако это будет означать, что он будет включен в следующую фиксацию, по крайней мере, как факт, что есть новый файл.
Я хочу, чтобы это было в разделе B исключительно, чтобы впоследствии добавить его в с помощью git add -p
или git add foo
(или что-то еще).
Изменить
Что касается решения add -N
, это не сработает, потому что если я попытаюсь зафиксировать после того, как сказал add -N
и не добавил его правильно, git жалуется, потому что он не знает, как обрабатывать пустые файлы:
foo: not added yet
error: Error building trees
Ответы
Ответ 1
С Git 2,5, git add -N/--intent-to-add
на самом деле является правильным решением.
Новый файл не будет частью следующей фиксации.
См. 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
" должен показывать их как новые. + файлы еще не добавлены в индекс.
Ответ 2
Возможно, вы могли бы попытаться написать некоторый крюк pre-commit, который предупреждает вас, если у вас есть необработанные файлы. Это потребует от вас всегда держать ваш каталог git в чистоте, хотя (и, очевидно, вам нужно будет поддерживать обновленный .gitignore).
Также попробуйте git add -i
, который похож на git add -p
, но также имеет интерфейс для добавления новых файлов.
Ответ 3
Вы можете передать пустой файл с этим путем перед внесением изменений. Если вы уже написали что-то там, переместите файл, сделайте пустой файл, зафиксируйте его, затем добавьте -p как обычно и git commit --amend
, чтобы у вас не было фиксации "Добавить пустой файл".