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 в данный момент не отслеживает. Обычно я делаю и то, и другое после переименования, объединения и / или разделения файлов кода.
— Мы все Моника

Если они отсутствуют, то они уже не удалены? Если только ... вы не вытащили откуда-то еще, а затем вы пытаетесь синхронизировать с удаленным ... Я думаю, я понял.
— Баттл Буткус

Я проверил все ответы, если есть пустая неотслеживаемая папка, никто не может ее найти.
— Kittygirl

@kittygirl это правильно. Поскольку gitработает только с файлами, у него нет никакого способа отслеживания пустых папок. Попробуй find . -type d -emptyвместо этого.
— Мы все Моника

Ответы:


531

Чтобы получить список неотслеживаемых файлов, попробуйте:

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-files


7
Отлично! Что !означает в начале строки псевдонима или где это задокументировано?
— Мы все Моника

@takeshin Как получить только имена родительских каталогов? не подпапки. Значения в этих неотслеживаемых файлах: / P / a / files, / 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дает чистый вывод, обжигающе горячий.
— hyperpallium

28

Принятый ответ падает на имена файлов с пробелом. На данный момент я не уверен, как обновить команду alias, поэтому я выложу улучшенную версию здесь:

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.