'git add --patch' для включення нових файлів?


104

Коли я запускаю git add -p, чи існує спосіб git обрати щойно зроблені файли як хунк, щоб вибрати ??

Отже, якщо я створюю новий файл під назвою foo.java, запускаю git add -p, git не дозволить мені вибрати вміст цього файлу, який потрібно додати до індексу.

Відповіді:


77

Для цього з усіма новими файлами ви можете запустити:

git add -N .
git add -p

Якщо ви хочете використовувати його часто, ви можете створити псевдонім у вашому ~/.bashrc:

alias gapan='git add --intent-to-add . && git add --patch'

Примітка : Якщо ви використовуєте це з порожнім новим файлом, git не зможе переправити його та перейти до наступного.


13
Для всіх, хто цікавиться, що git add -Nробить, він просто додає вказані незатребувані файли до індексу, але без вмісту.
Одін

112

Коли я спробував git add -p someNewFile.txtновий файл (файл без треку), git просто виведе No changes.і зупинить. Мені довелося сказати git, що я маю намір спочатку відстежити новий файл.

git add -N someNewFile.txt
git add -p

Однак, оскільки файл не був вилучений, він відображатиметься як одна гігантська команда, яку неможливо розділити (адже це все нове!). Отже, тоді мені потрібно було відредагувати хунку на менші шматочки. Якщо ви не знайомі з цим, ознайомтесь із цією посиланням, щоб розпочати роботу.

Оновлення - інформація про редагування Ханка Я хотів оновити це у випадку, якщо вищезазначена посилання відійде. Оскільки новий файл не відслідковується, git add -pбуде показаний кожен рядок у файлі як новий рядок за один фрагмент. Потім він запитає, що ви хочете зробити з цією частиною, даючи вам наступну підказку:

Stage this hunk [y,n,q,a,d,/,e,?]?

Припускаючи, що ви не хочете вчинити цілу частину (і, таким чином, весь файл; тому що я не впевнений, чому ви хочете використовувати git add -pв такому випадку?), Ви захочете вказати варіантe щоб сказати git, що ви хочете редагувати хунк.

Як тільки ви скажете git, що ви хочете відредагувати лук, він повинен перенести вас у свій редактор, який ви обрали, щоб ви могли внести зміни. Усі рядки мають бути префіксом a, +а #в кінці файлу git має деякі пояснювальні коментарі (з префіксом a ). Просто видаліть будь-які рядки, які ви не хочете, у первинному фіксування файлу. Потім збережіть і закрийте редактор.

Пояснення Git варіантів навішування:

y - stage this hunk
n - do not stage this hunk
q - quit; do not stage this hunk or any of the remaining ones
a - stage this hunk and all later hunks in the file
d - do not stage this hunk or any of the later hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
k - leave this hunk undecided, see previous undecided hunk
K - leave this hunk undecided, see previous hunk
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help

1
Будь ласка, хтось відповість на це коротко.
Інанк Gumus

5
git add -N someNewFile.txtgit add -p
Підводячи

7

git add -p насправді полягає в додаванні змін до вже відслідкованих файлів.

Команда для інтерактивного вибору файлів для додавання є git add -i. Наприклад:

$ git add -i

*** Commands ***
  1: status   2: update   3: revert   4: add untracked
  5: patch    6: diff     7: quit     8: help
What now> a
  1: another-new.java
  2: new.java
Add untracked>> 2
  1: another-new.java
* 2: new.java
Add untracked>> 
added one path

*** Commands ***
  1: status   2: update   3: revert   4: add untracked
  5: patch    6: diff     7: quit     8: help
What now> q
Bye.
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   new.java

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        another-new.java

(У реальній команді є кольори, які я не зміг вирізати та вставити тут, тож це приємніше, ніж здається)

Насправді команда p atch git add -iвиконує те саме git add -p, що і друге - це підмножина першого (хоча я визнаю, що люблю add -pі ненавиджу add -iсебе!).


"Я визнаю, що люблю add -p і ненавиджу add -i сам!" Ось чому git add then patch - це рішення, яке я люблю: воно все ще дозволяє перевіряти вміст нових файлів, які ви додаєте (оскільки ви порівнюєте їх з їх порожніми версіями), а також патч-файли, які ви редагували!
Уліссе БН

Виправте мене, якщо я помиляюся, але навіть тут, в інтерактивному режимі, патч все одно виведе No changes.новий файл. ОП запитували, як додати описи з нового файлу, а не з цілого файлу. Я вважаю, що --intent-to-addтут все ще потрібно.
Джефф Пукетт

add -pпоодинці не вийде, але ця відповідь підказує add -i, що це так
Матьє Мой

Я головую, тому що я не знав про це git add -i. Однак ви можете зробити те саме, що не інтерактивно git add -N.
Божевільний фізик

4

Існує також дуже подібний підхід із використанням --cachedпрапора ...

1) Перетворіть ваші нестандартні зміни в поетапні, як і доданий файл.

git add edited-file.txt
git add new-file.txt
git add directory-of-changes/

2) Подивіться на відмінність (зверніть увагу: ви можете включати як редагування, так і нові файли).

git diff --cached

3) Створіть виправлення.

git diff --cached > my_patch_file.patch

На жаль, це не виконає тієї самої мети. Мені подобається те git add -p, що він не додає всього, але давайте вибирати і вибирати те, що я хочу додати. Це рішення наосліп би додало все.
Олександр Птах

Ну ви можете вибрати те, що додаєте! Я оновлю відповідь.
doublejosh

1
дякую: все: для мене це дивовижно працює
macool
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.