git: Как игнорировать все существующие неотслеживаемые файлы?

131

Есть ли удобный способ игнорировать все неотслеживаемые файлы и папки в репозитории git?
(Я знаю о.gitignore .)

Так git statusснова обеспечил бы чистый результат.

sjas
источник
Или вы можете добавить один * в свой файл .gitignore. :)
vilicvane 07
1
Просто *, скорее всего, будет не то, что вы хотите.
sjas
Удивлен таким количеством неправильных ответов. -u noнеправильно. -unoправильно. -u noпытается сделать статус файла с именем no! noЭто не аргумент для -u. Чтобы заставить noинтерпретировать как аргумент -u, не должно быть места. Чтобы проверить это, сделайте touch Invalidи сравните git status -uInvalidс git status -u Invalid.
Аарон МакДэйд

Ответы:

252

Как уже было сказано, для исключения из статуса просто используйте:

git status -uno  # must be "-uno" , not "-u no"

Если вместо этого вы хотите навсегда игнорировать неотслеживаемые в данный момент файлы, вы можете из корня вашего проекта запустить:

git status --porcelain | grep '^??' | cut -c4- >> .gitignore

Каждый последующий вызов git statusявно игнорирует эти файлы.

ОБНОВЛЕНИЕ : у приведенной выше команды есть небольшой недостаток: если у вас еще нет .gitignoreфайла, ваш gitignore проигнорирует себя! Это происходит потому, что файл .gitignoreсоздается до git status --porcelainвыполнения. Поэтому, если у вас еще нет .gitignoreфайла, я рекомендую использовать:

echo "$(git status --porcelain | grep '^??' | cut -c4-)" > .gitignore

Это создает подоболочку , который завершает перед тем.gitignore файла.

ОБЪЯСНЕНИЕ КОМАНДЫ, так как я получаю много голосов (спасибо!) Думаю, мне лучше немного объяснить команду:

  • git status --porcelainиспользуется вместо того, git status --shortпотому что руководство указано: «Предоставляйте выходные данные в формате, удобном для синтаксического анализа для сценариев. Это похоже на краткие выходные данные, но будет оставаться стабильным во всех версиях git и независимо от конфигурации пользователя». Таким образом, у нас есть возможность синтаксического анализа и стабильность;
  • grep '^??'фильтрует только строки, начинающиеся с ??, которые, согласно руководству по git status , соответствуют неотслеживаемым файлам;
  • cut -c4- удаляет первые 3 символа каждой строки, что дает нам только относительный путь к неотслеживаемому файлу;
  • что |символы трубы , которые проходят вывод предыдущей команды на вход следующей команды;
  • >>и >символы переадресация операторы , которые добавляют вывод предыдущей команды в файл или переписывает / создает новый файл, соответственно.

ДРУГОЙ ВАРИАНТ для тех, кто предпочитает использоватьsed вместо grepи cut, вот еще один способ:

git status --porcelain | sed -n -e 's/^?? //p' >> .gitignore
Диего
источник
3
cut -c4- удаляет первые 4 символа каждой строки, что дает нам только относительный путь к неотслеживаемому файлу; Номер -cобозначает начало списка номеров столбцов для вырезания. И 4- выбирает строку от столбца 4 до конца, которая обрезает столбцы 1-3. Таким образом, ваша команда вырезания фактически удаляет первые 3 символа каждой строки. Если вы удалите 4 символа из строки состояния git, например, для этого файла здесь:, ?? app/views/static_pages/contact.html.erbвы удалите первую букву app. Итак, команда верна, но объяснение неверно.
7stud
@ 7stud: спасибо, вы правы, я написал 4 по ошибке. Я исправил ответ.
Diego
2
Я очень ценю объяснение команды. Приятно знать, что делают случайные команды, которые я скопировал из Интернета, и помогает нам всем научиться лучше использовать командную строку и git.
Эрик Фиттинг,
1
-u noу меня не работает. Но -unoделает. Я обновил ответ соответственно. Это странный дизайн для git. Я нахожусь на git 1.7.1
Аарон МакДэйд
2
@AaronMcDaid: спасибо. Изменение документирована здесь , и обсуждается здесь
Диего
51

Если вы хотите навсегда игнорировать эти файлы, простой способ добавить их .gitignore:

  1. Перейдите в корень дерева git.
  2. git ls-files --others --exclude-standard >> .gitignore

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

poolie
источник
3
Почему это не набирает столько голосов? Нет необходимости использовать 2 другие программы!
JoelFan
4
@JoelFan: две причины: 1) этот работает только из корня git , в то время как принятый работает из каждого подкаталога, вам просто нужно настроить .gitignoreпуть назначения 2) если у вас есть неотслеживаемый каталог, этот список каждый и каждый отдельный файл в нем, но не сам неотслеживаемый каталог (так что вы не будете игнорировать каталог и, таким образом, по-прежнему получать сообщения о будущих файлах в каталоге как неотслеживаемые, в то время как принятый перечисляет только каталог, а не неотслеживаемые файлы внутри . Это вопрос того, что вы хотите сделать, но часто вы просто хотите проигнорировать весь
Диего
1
Спасибо, Poolie. Я ценю разницу в вашем предложении из- за пунктов, упомянутых @Diego. Я начал работать с библиотекой файлов и папок, и я не хочу отслеживать / отправлять исходные файлы. Я хочу отслеживать только файлы, которые я добавляю или восстанавливаю в библиотеке. Добавление родительских папок игнорирует все. Это / ваше решение мгновенно добавило все 1696 файлов. xD
Chaos7703
Этого также можно добиться с помощью git config status.showUntrackedFiles no.
larsch
16

Нашел в мануале

Параметр mode используется для указания обработки неотслеживаемых файлов. Это необязательно: по умолчанию используется все, и если он указан, он должен быть привязан к опции (например, -uno, но не -u no).

git status -uno

sjas
источник
39
Что ж, если все будут RTFM перед публикацией, никто из нас никогда не получит никакой репутации :-)
Jenny D
4

Два пути:

используйте аргумент "-uno" для git-status. Вот пример:

[jenny@jenny_vmware:ft]$ git status
# On branch ft
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       foo
nothing added to commit but untracked files present (use "git add" to track)
[jenny@jenny_vmware:ft]$ git status -uno
# On branch ft
nothing to commit (working directory clean)

Или вы можете добавить файлы и директории в .gitignore, и в этом случае они никогда не появятся.

Дженни Д
источник
2
Удобный способ редактирования .gitignoreсущества git status | cat >> temp && vim temp. Затем отредактируйте файл так, чтобы первые несколько строк и последняя строка были удалены, а также конечные #и пробелы после них. Тогда cat temp >> .gitignore && rm temp. Если .gitignoreраньше не было, mv temp .gitignoreподойдет. Уродливая штука, но лучше, чем обновлять .gitignoreвручную.
sjas
1
Это неверный ответ. Правильный ответ -uno. Если вы используете -u no, это эквивалентно no -u- он будет делать статус для файла с именем no(который, вероятно, не существует) и использовать -uрежим по умолчанию . то есть это эквивалентgit status no
Аарон МакДэйд
3

-u noне показывает неустановленные файлы. -unoработает по желанию и показывает неустановленные, но не отслеживает.

футбол
источник
1
Даже это не совсем правильно. git status -u Xэквивалентно git status X -u( Xне является аргументом -u). Это, в свою очередь, эквивалентно git status X(потому -uчто по умолчанию без аргумента -u). Следовательно, это просто git-статус в файле X. Так что , если Xэто noон просто пытается сделать статус GIT на файл с именем no, которое вы , вероятно , нет
Аарон МакДейд
2

Если вы не используете Unix-подобную ОС, это будет работать в Windows с использованием PowerShell.

git status --porcelain | ?{ $_ -match "^\?\? " }| %{$_ -replace "^\?\? ",""} | Add-Content .\.gitignore

Однако .gitignoreфайл должен иметь новую пустую строку, иначе он добавит текст в последнюю строку независимо от того, есть ли в нем содержимое.

Это может быть лучшей альтернативой:

$gi=gc .\.gitignore;$res=git status --porcelain|?{ $_ -match "^\?\? " }|%{ $_ -replace "^\?\? ", "" }; $res=$gi+$res; $res | Out-File .\.gitignore

vhanla
источник
1

Если у вас много неотслеживаемых файлов и вы не хотите " gitignore" их все, обратите внимание, что, начиная с git 1.8.3 (22 апреля 2013 г.) , git statusбудет упоминаться --untracked-files=noдаже если вы не добавляли эту опцию в первое место!

" git status" предлагает пользователям изучить --untracked=noвозможность использования этой опции, когда она занимает слишком много времени.

VonC
источник
0

Я пришел сюда, чтобы решить немного другую проблему. Может быть, это будет кому-то полезно:

Создаю новую ветку feature-a. в рамках этой ветки я создаю новые каталоги, и мне нужно изменить .gitignore, чтобы подавить некоторые из них. Это часто случается при добавлении в проект новых инструментов, которые создают различные папки кэша. .serverless, .terraformи т. д.

Прежде чем я буду готов объединить это с мастером, у меня есть кое-что еще, поэтому я masterснова оформляю заказ , но теперьgit status оформляю поднимаю эти подавленные папки, поскольку .gitignore еще не был объединен.

Ответ здесь на самом деле прост, хотя мне пришлось найти этот блог, чтобы понять это:

Просто проверьте файл .gitignore из feature-aветки

git checkout feature-a -- feature-a/.gitignore
git add .
git commit -m "update .gitignore from feature-a branch"
Уильям Джордж
источник