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.