Додавання лише невиправлених файлів


168

Однією з команд, які я вважаю неймовірно корисними в Git, є git add -uкидання в індекс всіх, крім неперероблених файлів. Чи є зворотне це? В останні кілька місяців я часто опинявся в такому положенні, коли інтерактивно додав деякі оновлення до індексу, і хочу додати до цього індексу всі незафіксовані файли, перш ніж зробити це.

Чи є спосіб додати до індексу лише незафіксовані файли, не визначаючи їх окремо? Я не бачу нічого очевидного в довідкових документах, але, можливо, мені цього не вистачає?

Дякую.


1
Що стосується "кинути все, але не відібрані файли, в індекс", .gitignoreвін спеціально розроблений для цієї мети, а не git add -u.
Pacerier

Крім того, ви просите додати відслідковувані файли, видаляючи всі відстежувані в даний час файли, або ви просите додати відслідковувані файли зверху до тих, що відслідковуються (що робить усе відстеженим)?
Pacerier

Відповіді:


236

З цим легко git add -i. Введіть a(для "додати не відстежувану"), потім *(для "всіх"), потім q(щоб вийти) і все закінчено.

Щоб зробити це за допомогою однієї команди: echo -e "a\n*\nq\n"|git add -i


4
Я сподівався, що є щось менше, добре, інтерактивне, але це, звичайно, краще, ніж файл за файлом. :-)
Роб Вілкерсон

34
echo -e "a\n*\nq\n"|git add -i
Мат

@Мати дякую, так це повна команда ----> git add -ia * q ??
BKSpurgeon

Argument list too long... дуже близько!
Симеон

1
Для мене з git 2.21.0 - це git add -iтоді 4додавати не відстежувану, а потім *для всіх, а потім qкинути
Гаррі Б

36

git ls-files -o --exclude-standard надає незатребувані файли, тому ви можете зробити щось на кшталт нижче (або додати до нього псевдонім):

git add $(git ls-files -o --exclude-standard)

1
псевдонім gau = "git ls-files -o --exclude-standard | xargs -i git add '{}'" працює для мене
Стефан

git ls-files --help - це досить корисне читання: -o, --others Show other (i.e. untracked) files in the output
Джошуа Кунцман

15

Не зовсім те, що ви шукаєте, але я вважаю це досить корисним:

git add -AN

Додасть усі файли до індексу, але без їх вмісту. Файли, які не відслідковуються, тепер ведуть себе так, ніби їх відстежують. Їх вміст відображатиметься в git diff, і ви можете додавати його потім інтерактивно git add -p.


Це саме те, що я шукав - дозволяє git commit -pтакож переглядати нові файли.
nitsujri

11

Ви можете додати це до файлу ~ / .gitconfig:

[alias]
    add-untracked = !"git status --porcelain | awk '/\\?\\?/{ print $2 }' | xargs git add"

Потім з командного рядка просто запустіть:

git add-untracked

Мені подобається такий підхід, але він не обробляє пробіли у назви файлів.
Пол Кокколі

9

Люди запропонували git ls-filesпередати висновки до, git addале це не вдасться у випадках, коли є імена файлів, що містять пробіли або символи глобуса, такі як* .

Безпечним способом було б використання:

git ls-files -o --exclude-standard -z | xargs -0 git add

де -zговорить git використовувати \0термінатори ліній і -0xargs те саме. Єдиним недоліком такого підходу є те, що -0опція нестандартна, тому xargsпідтримують її лише деякі версії .


6

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

git ls-files -o --exclude-standard $(git rev-parse --show-toplevel)

Щоб додати всі непотрібні файли в дерево:

git ls-files -o --exclude-standard $(git rev-parse --show-toplevel) | xargs git add

6

Я спробував це, і це спрацювало:

git stash && git add . && git stash pop

git stashдодасть усі змінені відстежені файли в окремий стек, а залишені файли - це файли без відстеження. Тоді, виконуючи необхідні дії, git add .ви ставите всі файли без відстежуваних файлів, як потрібно. Врешті-решт, щоб повернути всі змінені файли зі стека, виконавши цеgit stash pop


0

Якщо у вас є тисячі файлів, що не відслідковуються (так, не запитуйте), git add -iвони не працюватимуть при додаванні *. Ви отримаєте помилку із зазначенням Argument list too long.

Якщо ви також перебуваєте в Windows (не запитуйте №2 :-) і вам потрібно використовувати PowerShell для додавання всіх незатребуваних файлів, ви можете використовувати цю команду:

git ls-files -o --exclude-standard | select | foreach { git add $_ }

Більш скорочена версія:git ls-files -o --exclude-standard | % { git add $_ }
marckassay

0

Тут багато хороших порад, але всередині Powershell я не міг змусити його працювати.

Я розробник .NET, і в основному ми все ще використовуємо ОС Windows, оскільки ми так багато не використовували ядро ​​та крос-платформу .Net, тому моє щоденне використання з Git знаходиться в середовищі Windows, де частіше використовується оболонка Powershell а не Git bash.

Для створення псевдонімованої функції для додавання відслідковуваних файлів у сховище Git можна дотримуватися наступної процедури.

Всередині вашого $ профілю профілю Powershell (якщо він відсутній - ви можете запустити: New-Item $ Profile)

блокнот $ Профіль

Тепер додайте цей метод Powershell:

function AddUntracked-Git() {
 &git ls-files -o --exclude-standard | select | foreach { git add $_ }
}

Збережіть файл профілю $ і перезавантажте його в Powershell. Потім перезавантажте файл $ $ за допомогою:. $ профіль

Це подібно до вихідної команди в * nix середовищі IMHO.

Тож наступного разу, якщо ви розробник використовує Powershell в Windows проти Git repo і хочете просто включити непотрібні файли, ви можете запустити:

AddUntracked-Git

Це слідує умові Пауершелла, де у вас є дієслова-іменники.


0

git add. (додати всі файли в цей каталог)

git add -all (додайте всі файли у всі каталоги)

git add -N може бути корисним для перерахування тих, які пізніше ....


git add -uдодасть модифіковані файли не відстежені
Тарасович

-3

Щоб додати всі незафіксовані файли, є команда git

git add -A

Також якщо ви хочете отримати більш детальну інформацію про різні доступні параметри, ви можете ввести команду

git add -i

замість першої команди, за допомогою цього ви отримаєте більше опцій, включаючи опцію для додавання всіх незатребуваних файлів, як показано нижче:

$ git add -i попередження: LF буде замінено CRLF у README.txt. Файл матиме оригінальні закінчення рядків у вашому робочому каталозі. попередження: LF буде замінено CRLF у пакет.json.

* Команди * 1: стан 2: оновлення 3: відновлення 4: додавання відслідковуваного 5: виправлення 6: розріз 7: вихід 8: допомога Що тепер> а

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