Как подготовить только часть нового файла с помощью git? - PullRequest
205 голосов
/ 22 июня 2011

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

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

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

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

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

Ответы [ 5 ]

373 голосов
/ 22 июня 2011

Ого, все эти дела 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.
6 голосов
/ 22 июня 2011
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. Я не рекомендую делать это 1011 *
  • Подсказка Если вы работаете в 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 для очень интеллектуального управления индексами (см. Better git add -p? )

5 голосов
/ 22 апреля 2013

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

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

Git Gui screenshot

2 голосов
/ 22 июня 2011

Редактировать: сейчас это не работает. Я уверен, что это было раньше (на 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)

Это добавляет мне неотслеживаемые файлы. Со страницы руководства:

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

Это эффективно работает добавить - интерактивно, но обходит начальное командное меню и напрямую переходит к подкоманде patch. Увидеть «Интерактивный режим» для деталей.

0 голосов
/ 18 сентября 2018

Просто для записи еще одной возможности: Я использую

git add -N file
git add -p file

И тогда вы можете ставить куски или редактировать их на месте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...