Питання Ігнорувати файли, які вже були передані в сховище Git [duplicate]


На це питання вже є відповідь тут:

У мене вже є ініціалізований сховище Git, яке я додав .gitignore файл до Як я можу оновити індекс файл, щоб файли, які я хочу проігнорувати, ігноруються?


2192
2017-07-16 19:26


походження




Відповіді:


Щоб вимкнути a сингл файл, який вже був / доданий до вашого сховища тобто, припиніть відстежувати файл, але не видаляйте його з вашої системи: git rm --cached filename

Щоб відстежити кожен файл, який зараз є вашим .gitignore:

Спочатку внесіть будь-які виняткові зміни коду, а потім запустіть цю команду:

git rm -r --cached .

Це видаляє будь-які змінені файли з індекс(місцеположення), потім просто запустіть:

git add .

Приймати це:

git commit -m ".gitignore is now working"

Скасувати git rm --cached filename, використовувати git add filename.

Перш ніж запускати, обов'язково виконайте всі важливі зміни git add .    В іншому випадку ви втратите будь-які зміни до інших файлів.


3658
2017-07-06 17:09



Будьте обережні, щоб зробити всі ваші зміни раніше, інакше ви втратите контроль над усіма змінами файлів - Hoang Pham
@TravisWebb Вам потрібно було переконатися, що ви встановили .gitignore спочатку. Також я не хочу видаляти всі файли з індексу, тільки ті, що мені потрібні, використовуючи Fileglobs, такі як * .o - Jason S
@trobrock Ви можете, будь ласка, відредагувати свою відповідь, щоб містити в собі прихильність з самого початку? thks заздалегідь. - MEM
Відмінна відповідь, але git rm --cached filename здається трохи менш різким, імхо .. - Jim Morrison
@JimMorrison ви пропустили точку. якщо у вас є великий проект зі складним .gitignore (наприклад, проект C # у Visual Studio), виявлення кожного окремого файлу для видалення є виснажливим. ці три простих команди виправляють все безболісно. - longneck


Якщо ви намагаєтесь ігнорувати зміни до файлу, який вже відстежено в сховищі (наприклад, файл dev.properties, який вам потрібно буде змінити для вашого місцевого середовища, але ви ніколи не хочете перевіряти ці зміни), ніж те, що ви хочете зробити це:

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

Якщо ви хочете почати відстежувати зміни знову

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

Побачити git-update-index (1) Ручна Сторінка.

Також подивіться на skip-worktree і no-skip-worktree параметри для індексу оновлень, якщо вам це потрібно, щоб він зберігався раніше, ніж скинути git (через)


Оновлення: Оскільки люди запитують, ось зручний (і оновлений, оскільки прокоментував це нижче) псевдонім, для того, щоб побачити, які файли в даний момент "ігноруються" (--assume-unchanged) у вашій локальній робочій області

$ git config --global alias.ignored = !git ls-files -v | grep "^[[:lower:]]"

518
2017-09-14 23:55



Це геній! Блискуче корисно. Чи знаєте ви, чи є спосіб одержати список всіх файлів на утриманні? - artfulrobot
Це допоможе вам: git ls-files -v Якщо друкований символ є нижнім, файл позначається як припущений-незмінний. побачити: stackoverflow.com/a/2363495/677381 і: git-scm.com/docs/git-ls-files - dyodji
@dyodji Чи це тільки впливає на себе? Або всі користувачі? - wisbucky
Ось моя трохи докладніша версія ignored псевдонім, як це видно в моєму файлі ~ / .gitconfig: ignored = !git ls-files -v $(git rev-parse --show-toplevel) | (grep '^[[:lower:]]' || echo 'None ignored.') && echo '\nIgnore changes with: git update-index --assume-unchanged <file> \nor track again with: git update-index --no-assume-unchanged <file>' Частина верхнього рівня гарантує пошук всього сховища. - Chris
На жаль --assume-unchanged не працює git stash: зміни повертаються протягом git stash і не повторно застосовано під час git stash pop. Побачити це питання. - Scott Weldon


Щоб витягнути файл, який вже був доданий / ініціалізований у ваш репозиторій, тобто зупинити відстеження файлу, але не видаляти його з вашої системи: git rm --cached filename


351
2017-07-18 08:15



Це був ідеальний спосіб видалити пару файлів, які я додав, здійснив, але потім зрозумів, що треба не відстежувати. Після того, як додати ці файли до .gitignore, я зміг це зробити і відстежити їх ідеально. - Andrew Larned
Порада: наприклад, якщо ви додаєте *.config твоєму .gitignore, Ви можете зробити git rm --cached *.config зупинити відстеження всього *.config файли - dav_i
Також зауважте, що це буде видаляти файли з інших репо, які ви натискаєте, навіть якщо вони залишаються у вашій системі. Якщо ви просто ігноруєте зміни в файлах і не хочете їх видаляти з інших користувачів repos спробуйте використовувати git update-index --assume-unchanged file.name - dav_i
ІМО, це так правильна відповідь. Вікі відповіді працюють-люб'язний, але жахливо тяжкий, особливо заданий питанням. (Я виправив вікі, але я не знаю, як це зробити. "Скоро!";) - Olie
@ Оле бути надзвичайно обережно з цим "рішенням". Це воля видаліть файл у репо, і кожен, хто витягне цю зміну, буде також видалити файл. Найкращим рішенням буде це assume-unchanged, як сказав @dav_i, або --skip-worktree як альтернатива. - Sebastianb


Так - .gitignore система ігнорує файли, які в даний час не контролюються версією git.

І.е. якщо ви вже додали файл з назвою test.txt використовуючи git-add, потім додавання test.txt до .gitignore все одно призведе до змін test.txt для відстеження

Вам доведеться git rm test.txt спочатку і здійснити цю зміну. Тільки тоді зміниться на test.txt ігнорувати


78
2018-02-02 15:59



Це не зовсім так, можна проігнорувати зміни у відстежуваному файлі ... див. Мою відповідь: stackoverflow.com/a/11366713/677381 - dyodji
git update-index - assume-unchanged <file> і git rm --caheced <file> насправді не працює для мене. Я зробив git rm <file>, а потім створив новий файл після цього <file> успішно ігнорується. Я використовую версію git версії 1.8.1. Якщо це було проблемою. - mujaffars
Ваш синтаксис тут помилковий. його git rm test.txt і ось посилання на більш повну відповідь stackoverflow.com/questions/12661306/... - Linnea Huxford


Видалити кінцевий пробіл в .gitignore

Крім того, переконайтеся, що у вашому .gitignore немає кінцевого пробілу. Я підійшов до цього питання, тому що я шукав відповідь, тоді я мав смішне відчуття, що мені слід відкрити редактор, а не просто cat.ing .gnitignore. Видалено єдине додаткове місце з кінця і парф він працює зараз :)


50
2017-07-15 07:22



У мене була така сама проблема: P. У зв'язку з цим я також потрапив до цього питання. Добре, що ти маєш, це описано тут. +1 - Hindol
Якщо вам подобається я, ви використовуєте vi для швидкого редагування .gitignore use ': set list', щоб показати пробіл. - Sam Giles
Це сталося зі мною, коли я це зробив echo node_modules >> .gitignore (принаймні на вікнах) - Khôi
Протягом декількох тижнів я був розчарований цим, поки не побачив ваш проміжок. Спасибі, виправлено мою проблему. - Blazes


Я прослідкував за цими кроками

git rm -r --cached .
git add .
git reset HEAD

після цього git видалити всі файли (* .swp у моєму випадку), які слід ігнорувати.


40
2018-03-02 09:00



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


Якщо ви хочете зупинити відстеження файлу, не видаляючи файл із вашої локальної системи, який я віддаю перевагу ігноруванню config/database.yml файл Просто спробуйте:

git rm --cached config/database.yml
# this will delete your file from git history but not from your local system.

Тепер додайте цей файл до .gitignoreфайл і вносити зміни. І відтепер будь-які зміни, внесені в config / database.yml, не будуть відстежуватися git.

$ echo config/database.yml >> .gitignore

Дякую


37
2017-08-21 14:20





Щоб видалити лише кілька окремих файлів, відстежуваних:

git update-index --assume-unchanged path/to/file

Якщо ви хочете знову почати відстежувати це:

git update-index --no-assume-unchanged path/to/file                      

28
2018-04-17 07:21





Як пише dav_i, для того, щоб зберігати файл у репо та все-таки видаляти його з змін, не створюючи додаткового зобов'язання, ви можете скористатись:

git update-index --assume-unchanged filename

26
2018-04-12 20:39



Скасувати: git update-index --no-assume-unchanged filename - Chemical Programmer
Що робити, якщо ви хочете зробити це для всіх файлів у папці за один раз? - bg17aw


Не зовсім добре знаючи, що команда "відповідь" зробила, я це довела, до мого жаху. Він рекурсивно видаляє кожен файл із вашого git repo.

Стійка надходить на порятунок ... Як відновити "git rm -r."?

git reset HEAD

Зробив цей трюк, тому що я не мав обов'язків для локальних файлів, які я не хотів перезаписати.


24
2017-07-19 05:38



The git rm -r --cached . не працював для мене. Гіт все ще стверджував, що файл мого textmate не відстежувався, хоча tmproj знаходиться в моєму глобальному файлі ігнорування. Однак, скидання мого місцевого ретро, ​​як це, працювало. Насправді я додав "жорсткий" варіант, як і в git reset --hard HEAD. Це має мати майже такий самий ефект у цьому випадку. - IAmNaN
Будьте обережні з --hard прапор Це воля викиньте будь-які незв'язані зміни без попередження! - Mikko Rantalainen


Комплексні відповіді скрізь!

Просто скористайтеся наступним

git rm -r --cached .

Він видаляє файли, які ви намагаєтесь ігнорувати від початку, а не від майстра на вашому комп'ютері!

Після цього просто зробіть і натисніть!


24
2018-06-18 21:08