Застосування .gitignore до скоєних файлів


436

Я вчинив безліч файлів, які зараз хочу ігнорувати. Як я можу сказати git ігнорувати ці файли з майбутніх комітетів?

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


1
можливий дублікат файлу .gitignore без ігнорування
Wooble

8
@Wooble Відповідь може бути подібною, але це питання точно описує проблему, з якою я зіткнувся і мені потрібно було вирішити.
rjmunro

1
Це відповідь , який безпосередньо звертається в заголовку питання з мінімальними змінами в ваш мерзотникові репо: stackoverflow.com/a/26245961/3543437
kayleeFrye_onDeck

Відповіді:


471

12
Хоча файлів дуже багато. Я не хочу робити це для кожного окремо
user880954

1
Чи є файли в будь-яких загальних каталогах? Якщо ні, проблема зводиться до питання використання оболонки, а не до git.
Метт Бал

12
Там повинен бути режим "Я забув додати свій .gitignore до мого початкового фіксації".
Люк Пуплетт

9
Відповідь нижче цієї.
Lopsided

3
Він попросив мене додати прапор -r, щоб мати можливість це зробити.
Вішал Гулаті

599

Відредагувавши .gitignoreвідповідність ігнорованим файлам, ви можете git ls-files -ci --exclude-standardпереглянути файли, включені до списків виключення; ви можете потім зробити

//On Linux:
git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached
//On Windows:
for /F "tokens=*" %a in ('git ls-files -ci --exclude-standard') do @git rm --cached "%a"
//On mac
alias apply-gitignore="git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached"

щоб видалити їх із сховища (не видаляючи їх з диска).

Редагувати : Ви також можете додати це як псевдонім у свій .gitconfig файл, щоб ви могли його запускати будь-коли. Просто додайте наступний рядок у розділі [псевдонім] (змініть, якщо потрібно для Windows чи Mac):

apply-gitignore = !git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached

( -rПрапор xargsзабороняє git rmзапускати порожній результат і роздруковувати його повідомлення про використання, але він може підтримуватися лише GNU findutils. Інші версії xargsможуть або не можуть мати подібний варіант.)

Тепер ви можете просто набрати git apply-gitignoreрепо, і це зробить роботу за вас!


10
Я думаю, що xargs для mac не має -r ... або мій баггі / старий, я не знаю ... і чому !раніше git? ну ... мій один працював як alias apply-gitignore="git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached". tks!
Феліпе Сабіно

18
У Windowsfor /F "tokens=*" %a in ('git ls-files -ci --exclude-standard') do @git rm --cached "%a"
Люк Пуплетт

Це тільки що видалило мої файли .gitignore, а не файли, які я хотів ігнорувати, які були перелічені у файлах .gitignore - в цьому справа?
Hippyjim

@Hippyjim, якщо файли вже скоєні (навіть якщо вони були вказані у .gitignore), а .gitignore ще не скоєно, то це був би очікуваний результат, інакше я не впевнений, що відбувається у вашому випадку.
Джонатан Каллен

1
Для користувачів Mac -rза замовчуванням і не приймається версіями BSD. Тож видаліть -r.
Weishi Zeng

136

залишити файл у репо, але ігнорувати майбутні зміни до нього:

git update-index --assume-unchanged <file>

і скасувати це:

git update-index --no-assume-unchanged <file>

щоб дізнатися, які файли були встановлені таким чином:

git ls-files -v|grep '^h'

заслуга за оригінальну відповідь на http://blog.pagebakers.nl/2009/01/29/git-ignoring-changes-in-tracked-files/


1
Chronial має великий відповідь для робити це рекурсивно для каталогу: stackoverflow.com/a/16346756/1101076
jordan314

Я хотів зробити конфігурацію IDE, але не відслідковувати зайві зміни в ньому. Це працює, хоча я не впевнений, чи буде він працювати для інших, хто перевіряє сховище. Його можна поєднувати, git ls-files -ci --exclude-standard -z | xargs -0 git update-index --assume-unchangedякщо це допомагає.
dlamblin

7
Це єдина відповідь, яка робить саме те, що задається заголовним питанням. ЗДОРОВИЙ! Більшість цих інших відповідей непотрібно возитися з файлами.
kayleeFrye_onDeck

1
Це абсолютно правильна відповідь на питання. Використовуючи такі команди, як git rm --cachedвидалити файл у сховищі, що не відповідає потребі вікторини. Дякую. Я дійсно ціную це. Ваша відповідь мені дуже допомагає.
ramwin

88

Будьте впевнені, що вашим фактичним репо є найновіша версія

  1. Редагуйте .gitignoreза своїм бажанням
  2. git rm -r --cached .
  3. git add .

потім виконувати як завжди


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

3
Зауважте, що крок 2 може зайняти деякий час, якщо у вас є великий сховище.
мішечок

Це просто призвело до видалення всіх файлів з індексу! Це врятувало мене: git reset HEAD(Не забудьте
сховати

2
Крок 2 видаляє все, так, але крок 3 повинен прочитати їх усі, за винятком тих, які не вдаються через .gitignore.
ojchase

11

Старе питання, але деякі з нас перебувають у git-posh(повноваженнях). Це рішення для цього:

git ls-files -ci --exclude-standard | foreach { git rm --cached $_ }

0

Виконайте такі дії:

  1. Додати шлях до gitignoreфайлу

  2. Виконайте цю команду

    git rm -r --cached foldername
    
  3. вносити зміни, як зазвичай.

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