git: Як ігнорувати всі присутні файли без відтворення?


131

Чи є зручний спосіб ігнорувати всі непотрібні файли та папки у сховищі git?
(Я знаю про .gitignore.)

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



Або ви можете додати один * у файл .gitignore. :)
vilicvane

1
Просто *заповіт, швидше за все, не буде тим, чого ви хочете.
sjas


Здивований такою кількістю невірних відповідей. -u noнеправильно. -unoправильно. -u noнамагається зробити статус у файлі під назвою no! noЦе НЕ аргумент для -u. Щоб змусити noтрактуватися як аргумент -u, не повинно бути місця. Щоб перевірити це, зробити touch Invalidі порівняти git status -uInvalidз git status -u Invalid.
Аарон Макдейд

Відповіді:


251

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

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 , відповідають файлам, що не відслідковуються;
  • cut -c4- видаляє перші 3 символи кожного рядка, що дає нам лише відносний шлях до файлу, що не відслідковується;
  • ці |символи є трубами , які проходять висновок попередньої команди на вхід наступної команди;
  • >>і >символи переадресація оператори , які додають висновок попередньої команди в файл або переписує / створює новий файл, відповідно.

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

git status --porcelain | sed -n -e 's/^?? //p' >> .gitignore

3
cut -c4- видаляє перші 4 символи кожного рядка, що дає нам лише відносний шлях до файлу, що не відслідковується; -cпозначає початок списку номерів стовпців, які потрібно скоротити. І 4- вибирає рядок від стовпця 4 до кінця, який вирізає стовпці 1-3. Таким чином, ваша команда cut фактично видаляє перші 3 символи кожного рядка. Якщо ви видалили 4 символи з рядка статусу git, такого як цей для цього файлу тут:, ?? app/views/static_pages/contact.html.erbви видалите першу букву app. Отже команда правильна, але пояснення несправне.
7stud

@ 7stud: дякую, ти маєш рацію, я написав 4 помилково. Я зафіксував відповідь.
Дієго

2
Я дуже ціную пояснення команди. Приємно знати, що роблять випадкові команди, скопійовані з Інтернету, і допомагає нам усім навчитися краще використовувати командний рядок та git.
Ерік Фіттінг

1
-u noне працює для мене. Але -unoробить. Відповідно я оновив відповідь. Це дивна конструкція для git. Я на git 1.7.1
Aaron McDaid

2
@AaronMcDaid: спасибі Зміни задокументовані тут і обговорюються тут
Дієго

51

Якщо ви хочете назавжди проігнорувати ці файли, простий спосіб їх додати .gitignore:

  1. Перехід до кореня дерева git.
  2. git ls-files --others --exclude-standard >> .gitignore

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


3
Чому це не отримує стільки голосів? Не потрібно переглядати ще дві програми!
JoelFan

4
@JoelFan: дві причини: 1) ця працює лише з кореня git , тоді як прийнята працює з кожного підкаталогу, вам просто потрібно налаштувати цільовий .gitignoreшлях 2) якщо у вас немає непартованого каталогу, у цьому списку кожен і кожен окремий файл у ньому, але не сам некрашений каталог (так що ви не будете ігнорувати каталог, і, таким чином, все ще отримуватимете звіт про майбутні файли в каталозі як нерозглянуті, тоді як прийнятий перелічує лише каталог, а не незатребувані файли всередині Це питання того, що ти хочеш робити, але часто просто хочеш проігнорувати весь рейтинг
Дієго

1
Спасибі Poolie я оцінити різницю в вашому реченні , так як точок , згаданих @Diego я почав працювати з бібліотекою файлів і папок , і я не хочу , щоб відстежувати / розсунути вихідні файли. Я хочу лише відслідковувати файли, які я додаю або відновлюю в бібліотеці. Додавання батьківських папок все ігнорувало б. Це / ваше рішення швидко додало всі 1696 файлів. xD
Chaos7703

Цього можна досягти і за допомогою git config status.showUntrackedFiles no.
larsch

16

Знайшов це в посібнику

Параметр режиму використовується для задання обробки файлів, що не відслідковуються. Це необов'язково: він за замовчуванням для всіх, і якщо вказано, він повинен дотримуватися опції (наприклад, -uno, але не -u ні).

git status -uno


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


1

Якщо у вас є безліч непозаправлених файлів і не хочете " gitignore" всіх, зверніть увагу, що, оскільки git 1.8.3 (22 квітня 2013 р.) , git statusЗгадає --untracked-files=noнавіть те, що ви не додали цю опцію в першість!

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


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"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.