Питання Як зробити Git "забути" про файл, який був відслідковуваний, але тепер в .gitignore?


Є файл, який відстежувався git, але тепер файл знаходиться на .gitignore список

Однак цей файл продовжує з'являтися git status після його редагування. Як ти змушений? git повністю забути про це?


3665
2017-08-13 19:23


походження


git clean -X звучить схоже, але це не застосовується в цій ситуації (коли файли все ще відстежуються Git). Я пишу це для тих, хто шукає рішення, щоб не слідувати неправильному маршруту. - imz -- Ivan Zakharyaschev
Єдина реальна відповідь на це нижче внизу, див git update-index --assume-unchanged. Це рішення 1) зберігає файл на сервері (індекс), 2) дозволяє вільно змінювати його локально. - Qwerty
Ви повинні використовувати --skip-worktree, побачити: stackoverflow.com/questions/13630849/... - Doppelganger
Важливе питання: чи повинен файл залишатися в сховищі чи ні? Наприклад, якщо хтось новий клон репо, чи повинні вони отримати цей файл чи ні? Якщо ТАК потім git update-index --assume-unchanged <file> є правильним, і файл залишиться в сховищі, і зміни не будуть додаватися з git add. Якщо НЕМАЄ (наприклад, це був файл кешу, згенерований файл і т. д.), потім git rm --cached <file> буде видалено з репозиторію. - Martin
@Martin @Qwerty Кожен повинен перестати радити --assume-unchanged який для виконання, щоб запобігти git перевірити стан великих відслідковуваних файлів, але воліють --skip-worktree який призначений для модифікованих відслідковуваних файлів, які користувач більше не хоче робити. Побачити stackoverflow.com/questions/13630849/... - Philippe


Відповіді:


.gitignore буде заборонено додавати невідслідувані файли (без add -f) до набору файлів, відстежених git, проте git буде продовжувати відстежувати будь-які файли, які вже відстежуються.

Щоб зупинити відстеження файлу, потрібно видалити його з індексу. Це можна досягти за допомогою цієї команди.

git rm --cached <file>

Видалення файлу з головної редакції відбудеться на наступній фіксації.


3887
2017-08-13 20:40



процес, який працює для мене, був 1. виконати очікувані зміни першим. 2. git rm --cached <file> і здійснити знову 3. додати файл до .gitignore, перевірити з git статусом і здійснити знову - mataal
Дуже важливо додавання. Якщо файл, який ігнорується, буде змінений (але, незважаючи на це, він повинен бути неприпустимим), після модифікації та виконання git add . він буде доданий до індексу. І наступний внесок зобов'язує його сховища. Щоб уникнути цього, відразу після того, що матаал сказав ще одну команду: git update-index --assume-unchanged <path&filename> - Dao
Метод @AkiraYamamoto добре працював і для мене. У моєму випадку я придушував вихід, так як у моєму сховищі було тисячі файлів: git rm -r -q --cached . - Aaron Blenkush
Це призведе до видалення файлу git pull хоча - Petr Peller
git rm --cached <file> просто видаліть файл з репозиторію, git update-index --assume-unchanged <file> не відображається файл у нестабілізованих змінах і не витягує нових змін. Але я хочу GIT JUST IGNORE CONTENT OF FILE PLEEEEEASE - Igor Semin


У серії команд нижче буде видалено всі елементи з індексу Gіt (не з робочого каталогу або місцевого репо), а потім оновлюється індекс Gіt, при цьому повага до ігнорування git. PS Index = Cache

Перший:

git rm -r --cached . 
git add .

Потім:

git commit -am "Remove ignored files"

1997
2017-09-30 13:51



Щоб виділити різницю між цією відповіддю та прийнятим: Використовуючи ці команди, вам не потрібно знати відповідні файли. (Уявіть собі тимчасове поле з великою кількістю випадкових файлів, які слід видалити з індексу). - Ludwig
Так само, як прийнята відповідь. Файли будуть видалені на git pull. - Petr Peller
Було б приємно мати це як стандартну команду git. Щось на зразок git rmignored. - Berik
@gudthing -r означає "рекурсивний" - Monkey King
За допомогою цього ви можете додати інший непотрібні файли, які зараз відсутні .gitignore. Які можуть бути важко з'ясувати, якщо залежно від того, як шум вашої git status є після цієї команди. Команда, яка тільки видаляє нові ігноровані файли були б кращими. Ось чому я віддаю перевагу відповідь thSoft - KurzedMetal


git update-index робить цю роботу для мене:

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

Примітка: Цей варіант насправді незалежний .gitignore оскільки gitignore є лише для невідслідуваних файлів.

редагувати: Оскільки дана відповідь була опублікована, була створена нова опція, яку слід віддати перевагу. Ви повинні використовувати --skip-worktree який призначений для модифікованих відстежуваних файлів, які користувач більше не хоче робити та зберігати --assume-unchanged для роботи, щоб запобігти git перевірити стан великих відслідковуваних файлів. Побачити https://stackoverflow.com/a/13631525/717372 для більш детальної інформації ...


740
2017-11-27 11:24



Це IS справжня відповідь. Приголомшливі фактично, дуже прості, не забруднюють git status і насправді дуже інтуїтивно зрозумілий. Дякую. - Pablo Olmos de Aguilera C.
Я пішов на достатню користь rm [...] . Рішення, як мінімум, я міг зрозуміти, як це спрацювало. Я не знайшов чудової документації про те, що update-index & --assume-unchanged робити Чи може хто-небудь додати, як це порівнюється з іншим, тому я хотів би видалити всі файли, які були б проігноровані? (Або посилання на чітке пояснення?) - Brady Trainor
git update-index --assume-unchanged <path> … призведе до того, що git буде ігнорувати зміни вказаного шляху (ів) незалежно від .gitignore. Якщо ви потягнете з пульта дистанційного керування і цей пульт змінив цей шлях, git не зможе об'єднати конфлікт, і вам доведеться об'єднати вручну. git rm --cached <path> … призведе до припинення відстеження цього шляху. Якщо ви не додали шлях до .gitignoreви побачите шлях у майбутньому git status. Перший варіант має менше шуму в історії повноважень git і дозволяє змінити "ignored" файл, який буде поширюватися в майбутньому. - ManicDee
Скасувати за допомогою: git update-index - not-assume-unchanged <file> - xgMz
Я досить заплутаний щодо того, як це не прийнята відповідь. Прийнята відповідь тут явно не відповідає на фактичне запитання. Ця відповідь ігнорує зміни до файлу, що знаходиться в сховищі, поки не видаляється з сховища. - Dave Cooper


git ls-files --ignored --exclude-standard -z | xargs -0 git rm --cached
git commit -am "Remove ignored files"

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


218
2018-05-23 22:29



Якщо вам потрібно видалити їх з робочого каталогу, то просто запустіть git ls-files --ignored --exclude-standard | xargs git rm . Я вірю, що ця відповідь найкраща! Оскільки це дуже чітко, Unix-шлях, і робить потрібну річ безпосередньо, без складання побічних ефектів інших, більш складних команд. - imz -- Ivan Zakharyaschev
Відмінна відповідь; однак, команда не зможе, якщо у вас є шляхи з пробілами в середині, наприклад: "My dir / my_ignored_file.txt" - David Hernandez
git ls-files --ignored --exclude-standard | sed 's /.*/"&"/' | xargs git rm --cached - David Hernandez
git rm скаржиться якщо ls-files нічого не збігається. Використовуйте xargs -r git rm ... розповісти xargs не бігти git rm якщо не знайдено відповідних файлів. - Wolfgang
Було б краще використовувати \ 0 як сепаратор: git ls-files --ignored --exclude-standard -z|xargs -0 git rm --cached - Nils-o-mat


Я завжди використовую цю команду, щоб видалити ці нерозбиті файли. Однорядковий, Unix-стиль, чистий вихід:

git ls-files --ignored --exclude-standard | sed 's/.*/"&"/' | xargs git rm -r --cached

Тут перелічено всі ваші ігноровані файли, замість кожної вихідної лінії з цитованою лінією, а не для обробки шляхів із пробілами всередині, і передавати все git rm -r --cached для видалення шляху / файлів / dirs з індексу.


60
2018-06-19 15:42



Відмінне рішення! Працював відмінно і відчуває себе більш правильним, що видаляючи всі файли, потім додаючи їх назад. - Jon Catmull
Я теж знайшов це "найчистіше". Це може бути очевидним, але просто запустіть першу частину git ls-files --ignored --exclude-standard, самостійно дозволяє вам спочатку зрозуміти / перевірити, які файли нові .gitignore збирається виключити / видалити, перш ніж продовжувати і виконувати фінал git rm. - JonBrave
Майте на увазі, не вдається з іменами файлів з певними "противними" символами в них, наприклад \n. Я розмістив своє рішення, щоб задовольнити це. - JonBrave
Інше застереження: на тлі, це призведе до того, що файл буде видалений в інших робочих каталогах, чи не так? - LarsH


Якщо ти не можеш git rm відслідковуваний файл, оскільки може знадобитися іншим користувачам (попередження, навіть якщо ви  git rm --cached, коли хтось отримує цю зміну, їх файли будуть видалені в їх файловій системі), будь ласка, подивіться на https://gist.github.com/1423106 за те, як люди працювали над проблемою.


49
2017-07-19 00:08



git не видаляє файл, якщо воно було брудно під час видалення. І якщо це не брудно, завантаження файлу буде настільки ж простим, як і git checkout <oldref> -- <filename> - але тоді це буде перевірено і проігноровано. - amenthes
Хоча це теоретично може відповісти на питання, це було б краще включити основні частини відповіді тут і надати посилання для довідки. Побачити тут для інструкцій, як писати краще "посилання на основі" відповідей. Дякую! - GhostCat
Просто кажу. 5-річна відповідь, і 45 upvotes, але ніхто не наважується сказати "посилання тільки відповіді є погані?" - GhostCat


перемістіть його, здійсніть, а потім переведіть його назад. Це працювало в мене в минулому. Існує, мабуть, "гострий" спосіб досягти цього.


44
2017-08-13 19:27



Це чудово працювало, якщо ви хочете ігнорувати купу файлів, які раніше не були проігноровані. Хоча, як ви сказали, можливо, для цього є кращий спосіб. - Oskar Persson
Це саме те, що я зробив. Просто перенесіть файли в папку за межами git, потім виконайте "git add.", "Git commit". (Це видаляє файли), потім додайте gitignore, посилаючись на файли / папки, знову зробите це, щоб додати файл gitignore в git, потім скопіюйте / перемістіть назад у папки, і їх слід ігнорувати. Зверніть увагу: з'явиться, що файли були видалені з GIT, тому вони, ймовірно, будуть видалені з інших перевірок / розтягувань, як зазначено вище, але оскільки ви створюєте їх копії, це не так багато, як IMHO. просто дозвольте іншим командам знати ... - Del
Це найпростіший спосіб позбутися від неправильно вчинених папок. - Martlark
Здається, єдиний шлях, який я бачу. Це величезна помилка (а не "функція") в git, що як тільки ви додаєте файл / папку до .gitignore, це не просто ігнорувати цей файл з цього моменту на - назавжди - скрізь. - JosephK