Как создать только часть нового файла с помощью git?

I любовь git add --interactive. Теперь это часть моего ежедневного рабочего процесса.

Проблема заключается в том, что она не работает с невоспроизводимыми файлами. То, что я хочу сделать, это отслеживать новый файл, но только добавить его часть, т.е. Некоторые части этого нового файла еще не готовы к постановке.

Например, с git add -i, я могу выбрать вариант патча и даже отредактировать отдельные куски, чтобы выполнить части нового кода, оставив неучетные комментарии отладочного кода. Мне нравится работать таким образом, потому что это делает очевидным, какие места мега-патча, в котором я сейчас работаю, все еще нуждаются в работе.

К сожалению, я, похоже, не могу сделать то же самое с неподготовленным файлом. Либо я создаю весь файл, либо ничего. Обходной путь, который я использовал, - это постановка или даже запись нового файла, когда он пуст, а затем индивидуальные изменения в обычном режиме. Но это решение кажется грязным взломом, и когда я забываю или передумаю, это создает больше проблем, чем должно быть.

Итак, вопрос заключается в следующем: как создать только часть нового файла, чтобы этот новый файл отслеживался, но оставив все или часть его содержимого неактивным?

Ответ 1

Ого, все, что update-index и hash-object кажется слишком сложным. Как об этом:

git add -N new_file
git add -i

От git help add:

-N, --intent-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.

Ответ 2

git update-index --add --cacheinfo 100644 $(git hash-object -w /dev/null) newfile
git add --interactive newfile

Простая демонстрация:

mkdir /tmp/demo
cd /tmp/demo
git init .

echo hello > newfile
git update-index --add --cacheinfo 100644 $(git hash-object -w /dev/null) newfile
  • Совет. Если вы уверены, что "пустой" блок уже существует в вашей базе данных объектов git, вы можете вместо этого сделать хэш-код e69de29bb2d1d6434b8b29ae775ad8c2e48c5391. Я не рекомендую делать это _
  • Совет Если вы находитесь в Windows, вы, вероятно, можете просто использовать NUL: вместо /dev/null. В противном случае используйте что-то вроде echo -n '' | git hash-object --stdin -w

Теперь индекс будет содержать newfile в качестве пустого blob, а пустой блок будет введен в базу данных объекта, если он еще не существует:

<суб >

$ find .git/objects/ -type f 
.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391

$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   newfile
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   newfile
#

$ git diff
diff --git a/newfile b/newfile
index e69de29..ce01362 100644
--- a/newfile
+++ b/newfile
@@ -0,0 +1 @@
+hello

суб > Это должно быть именно то, что вы хотите. Могу ли я также рекомендовать vim fugitive plugin для очень интеллектуального управления индексами (см. Лучше git добавить -p?)

Ответ 3

Самый простой способ сделать это (и интерактивная установка imho в целом) git gui. Он поставляется в комплекте с git и должен работать практически на всех платформах, поддерживаемых git.

Просто запустите git gui, и откроется GUI, позволяющая создавать сцены и неустановленные куски и даже одиночные строки отслеживаемых и не отслеживаемых файлов.

Git Gui screenshot

Ответ 4

Изменить: теперь это не работает. Я уверен, что это было до (на git 1.7.1). Если это не сработает, я предлагаю организовать /dev/null, как указано выше:

git update-index --add --cacheinfo 100644 $(git hash-object -w /dev/null) newfile

Если вы находитесь в Windows (без /dev/null), вы можете заменить его пустым файлом.

Оригинальный ответ

Вы хотите

git add -p # (or --patch)

Это добавляет для меня невоспроизводимые файлы. На странице man:

Интерактивно выбирайте куски патча между индексом и деревом работ и добавьте их в индекс. Это дает пользователю предоставляется возможность просмотреть перед добавлением измененных содержимое в индекс.

Это эффективно запускает добавление --interactive, но обходит исходное командное меню и напрямую переходит к подкоманде патча. Видеть "Интерактивный режим" для деталей.