Git: список лише файлів, які не відслідковуються (також спеціальні команди)


339

Чи є спосіб використовувати команду на зразок git ls-filesпоказувати лише невиправлені файли?

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

git ls-files -d | xargs git rm

Я хотів би щось подібне для файлів, що не відслідковуються:

git some-command --some-options | xargs git add

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

git status --porcelain | grep '^??' | cut -c4- | xargs git add

Здається, що тут повинна бути краща команда, яку я можу використовувати тут. А якщо немає, то як створити власні команди git?


Чи можете ви детальніше пояснити, для чого це потрібно git ls-files -d | xargs git rm?
приймає

Це видаляє всі файли, про які відсутні повідомлення про git. Моє запитання стосувалося того, як зробити пов’язану операцію - додайте всі файли, які git наразі не відстежує. Зазвичай я робив би те і інше після перейменування, комбінування та / або розділення файлів коду.
Ми всі Моніка,

Якщо вони відсутні, то чи не вже їх видалено? Якщо тільки ... ти витягнув звідкись іншого, а потім намагаєшся синхронізуватись із дистанційним ... Я думаю, що я це зрозумів.
Buttle Butkus

Я перевірив усі відповіді, якщо там порожня незавершена папка, ніхто не може її знайти.
kittygirl

@kittygirl це правильно. Оскільки gitпрацює лише з файлами, він не має жодного способу відстеження порожніх папок. Спробуйте find . -type d -emptyзамість цього.
Ми всі Моніка

Відповіді:


529

Щоб перелічити неполічені файли, спробуйте:

git ls-files --others --exclude-standard

Якщо вам потрібно передати висновок xargs, розумно мати на увазі пробіли, використовуючи git ls-files -zта xargs -0:

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

Хороший псевдонім для додавання відслідковуваних файлів:

au = !git add $(git ls-files -o --exclude-standard)

Редагувати: Для довідки: git-ls-файли


7
Ідеально! Що !означає на початку рядка псевдоніму або де це документально зафіксовано?
Ми всі Моніка,

@takeshin Як отримати лише імена батьківських каталогів? не підпапки. Засоби в цих нерозкритих файлах: / P / a / файли, / P / a / images, / P / a / / P /, ... - Я просто хочу список / P /
Dr.jacky

2
У якій ситуації вам би потрібен псевдонім? git add *зробимо те ж саме: додамо всі незаймані файли, виключаючи стандартні (файли, чиї шляхи охоплені .gitignore).
toinetoine

1
Я віддаю перевагу своєму псевдоніму послідовно працювати у всіх каталогах репо (команда ls-files показує лише змінені файли в поточному дереві), тому я маю[alias] lso = "!f() { cd $(git rev-parse --show-toplevel); git ls-files -o; }; f"
qneill

Дякую. Хороший коментар.
Дарт Егрегійний

71

Якщо ви просто хочете видалити незаймані файли, зробіть це:

git clean -df

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

Ви можете створити користувацький git, просто написавши сценарій, який називається, git-whateverі мати його на своєму шляху.


Набагато частіше зустрічається те, що я хочу додати всі незаймані файли (наприклад, після переміщення деяких речей). У будь-якому випадку, дякую за пораду про власні команди. Де цей механізм задокументований?
Ми всі Моніка,

5
Просто зробіть git add -Aабо git add -u(залежно від того, що для вас має більше сенсу)
Дастін

1
Ваш коментар - справжня відповідь, яку також повторив пізніше @Mike Lococo
andho

2
та "git clean -dfxn" для сухого циклу, додавши "n"
charo

50

git add -A -nзробить те, що ти хочеш. -Aдодає всі відслідковувані файли до репо, -nробить його там, dry-runде додавання не виконується, але виводиться статус, перераховуючи кожен файл, який був би доданий.


7
Це чудова відповідь! Зауважте, що він виключає файли у .gitignoreфайлах, що зазвичай є тим, що ми хочемо, але якщо ні, то git add -fAn.
cdunn2001

1
Це здається найкращою відповіддю.
Роб Грант

1
Це найкраща відповідь. Він чітко повідомляє користувачеві, що він би робив (не роблячи цього) і дає можливість переглянути його, перш ніж насправді додати його. Ідеально. Дякую!
digitguy

Тут також перелічені модифіковані файли.
Франк-Рене Шефер

добре, але я отримую це загорнутим: add '$file'. В той час, як git ls-files --exclude-standard -oдає голий вихід, трубопроводи гарячі.
гіперпалій

28

Прийнята відповідь вибивається з назви файлів з пробілом. На даний момент я не впевнений, як оновити команду псевдонім, тому я поставитиму тут вдосконалену версію:

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

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

27

Все дуже просто

Для отримання списку всіх відібраних файлів використовуйте команду git status з опцією -u (--untracked-files)

git status -u

як щодо нерекурсивної версії цього?
Девід

На жаль, він також містить список ігнорованих файлів через файли .gitignore.
Plouff

8
Це єдина відповідь, яка показала мої ігноровані файли на початковому фіксації, але мені довелося додати --ignoredдо git status -uкоманди
DN

Це просто і приємно.
Ерік Ван

1
Це також показує модифіковані файли. Отже, не відповідь на запитання: показуйте лише непотрібні файли.
Wildcard

6

Шукаючи файли, які потенційно можна додати. Вихід з цього git showробить, але він також включає багато інших речей. Наступна команда корисна для отримання того ж списку файлів, але без усіх інших матеріалів.

 git status --porcelain | grep "^?? " | sed -e 's/^[?]* //'

Це корисно при комбінуванні в конвеєр, щоб знайти файли, що відповідають певній схемі, а потім передати їх git add.

git status --porcelain | grep "^?? "  | sed -e 's/^[?]* //' | \
egrep "\.project$|\.settings$\.classfile$" | xargs -n1 git add

6

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

Ви можете використовувати операцію git clean з -n (сухий запуск), щоб показати вам, які файли буде видалено (включаючи .gitignore файли):

git clean -xdn

Це має перевагу в тому, що показує всі файли та всі папки , які не відстежуються. Параметри:

  • x - Показує всі відслідковувані файли (включаючи ігноровані git та інші, як збірка виводу тощо ...)
  • d - показувати неперевірені каталоги
  • n- і найголовніше! - dryrun, тобто фактично нічого не видаляйте, просто використовуйте чистий механізм для відображення результатів.

Це може бути трохи небезпечно зробити так, як ви забули цей випадок -n. Тому я зазвичай псевдонім його в git config.


2

Усі попередні відповіді, які я перевіряв, також містили б перелік файлів, які потрібно зробити. Ось просте та просте рішення, яке містить лише ті файли, які ще не перебувають у репо-репортажі та не підлягають .gitignore.

git status --porcelain | awk '/^\?\?/ { print $2; }'

або

git status --porcelain | grep -v '\?\?'

це, здається, не працює добре з файлами, які мають пробіл у своєму імені
ssc

-2

Я думаю, що це буде те саме, що і оригінальний плакат:

git add .


2
Кожного разу, коли ви робите git/svn add ., кошеня помирає.
Накілон

Хе, лише якщо у вас місцеві копії віддалених гілок є кукурудзяні;) Створіть місцеві гілки і можете git add .безкарно!
Тім Фулмер

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