Подтвердить что ты не робот

Как вы можете 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
4b9b3361

Ответ 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, чтобы у вас не было фиксации "Добавить пустой файл".