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.