Застосувати .gitignore на наявному сховищі, яке вже відстежує велику кількість файлів


314

У мене в репозиторії є проект Visual Studio. Нещодавно я додав у свій проект файл .gitignore, і я вважаю, що він говорить Git ігнорувати файли, перелічені у файлі.

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

Було запропоновано використовувати: git rm --cachedі вручну відстежувати їх, але це візьме мене назавжди, щоб пройти їх по черзі.

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


1
Ви можете використовувати ці git rm --cachedкаталоги -r, якщо це корисно
Натан Уоллес



Відповіді:


870

Ця відповідь вирішила мою проблему:

Перш за все, здійснити всі очікувані зміни.

Потім запустіть цю команду:

git rm -r --cached .

Це видаляє все з індексу, а потім просто запустіть:

git add .

Здійснити це:

git commit -m ".gitignore is now working"

9
Ідеальна відповідь! Будь ласка, додайте git push originтакож, щоб відобразити зміни у віддаленому сховищі.
Санкет Берде

8
Я почав використовувати цю відповідь ... і він видалив майже все з мого проекту! Очевидно, я робив щось не так. Але я хочу попередити людей не дотримуватися цієї пропозиції випадково.
Марк Ольберт

4
Чи закінчується це втратою історії для файлів, коли ви видаляєте та повторно додаєте їх
Aran Mulholland,

10
Цікаво, скільки комісій там використовують це .gitignore is now workingповідомлення. :)
ihavenoidea

1
Цей метод добре працював для мене. Я створив файл gitignore, проігнорував весь каталог, а потім здійснив цю зміну створення gitignore. Потім я слідував за цими трьома командами вище саме так, як вони сказали. Це спрацювало чудово, але я мушу сказати, що спочатку потрібно "здійснити всі очікувані зміни", як зазначено вище.
Еріх Мейсснер

61
  1. Створіть файл .gitignore, для цього просто створіть будь-який порожній .txt файл.

  2. Тоді вам потрібно змінити його ім'я, записавши наступний рядок на cmd (де git.txtназва файлу, який ви тільки що створили):

    rename git.txt .gitignore

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

`` `

OS junk files
[Tt]humbs.db
*.DS_Store

#Visual Studio files
*.[Oo]bj
*.user
*.aps
*.pch
*.vspscc
*.vssscc
*_i.c
*_p.c
*.ncb
*.suo
*.tlb
*.tlh
*.bak
*.[Cc]ache
*.ilk
*.log
*.lib
*.sbr
*.sdf
*.pyc
*.xml
ipch/
obj/
[Bb]in
[Dd]ebug*/
[Rr]elease*/
Ankh.NoLoad

#Tooling
_ReSharper*/
*.resharper
[Tt]est[Rr]esult*

#Project files
[Bb]uild/

#Subversion files
.svn

# Office Temp Files
~$*

Існує ціла колекція корисних файлів .gitignore від GitHub

  1. Після цього вам потрібно додати його до вашого сховища git так само, як і будь-який інший файл, лише він повинен бути в корені сховища.

  2. Потім у свій термінал ви повинні написати наступний рядок:

    git config --global core.excludesfile ~ / .gitignore_global

З офіційного doc:

Ви також можете створити глобальний файл .gitignore, який є переліком правил ігнорування файлів у кожному сховищі Git на вашому комп'ютері. Наприклад, ви можете створити файл у ~ / .gitignore_global і додати до нього деякі правила.

Відкритий термінал. Виконайте таку команду у своєму терміналі: git config --global core.excludesfile ~ / .gitignore_global

Якщо репозиторій вже існує, вам потрібно виконати ці команди:

git rm -r --cached .
git add .
git commit -m ".gitignore is now working"

Якщо крок 2 не працює, то слід записати маршрут дір для файлів, які ви хочете додати.


4
@Karen_Wiznia "git config ... _global" створює глобальний gitingore для всіх репостів Git на комп'ютері. ОП не хотіла цього робити.
ivan7707

Я хотів би, щоб це могло мені сподобатися не раз, я постійно повертаюся до цього питання, шукаючи це нагадування.
Антоній Д'Андреа

1
Це має бути "mv git.txt .gitignore" замість "перейменувати git.txt .gitignore".
Ахмад Ф

30

Як зазначено тут, Ви можете оновити індекс:

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

Тим самим файли не відображатимуться в git statusабо git diff.

Щоб знову відстежувати файли, ви можете запустити:

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

5
Це краща відповідь - вона зосереджена лише на одному файлі, файлі, який ви не хочете відслідковувати у сховищі. Найвища відповідь також буде працювати, але це набагато більше, ніж просто ігнорувати файл із відстеження за допомогою git.
Кріс Мейка

1
Це добре. Але що робити, якщо ми потягнемо? Чи є конфлікти злиття?
прамод

@pramod, чудове запитання. Я не дуже впевнений. Спробувати це у схопленому тестовому сховищі?
Патрік Джеймс МакДугл

15

Якщо ви додали .gitignoreзанадто пізно, git продовжить відслідковувати вже зафіксовані файли незалежно. Щоб виправити це, ви завжди можете видалити всі кешовані екземпляри непотрібних файлів.

По-перше, щоб перевірити, які файли ви насправді відстежуєте, ви можете запустити:

git ls-tree --name-only --full-tree -r HEAD

Скажімо, що ви знайшли небажані файли в такому каталозі cache/, безпечніше орієнтуватися на цей каталог, а не на всі ваші файли.

Тож замість:

git rm -r --cached .

Безпечніше орієнтуватися на непотрібний файл чи каталог:

git rm -r --cached cache/

Потім додайте всі зміни,

git add .

і вчинити ...

git commit -m ".gitignore is now working"

Довідка: https://amyetheredge.com/code/13.html


Це найкраща і чітка відповідь, якщо ви хочете видалити лише кілька файлів, а не весь сховище. Я даю вам великі пальці вгору.
Апуйг

2

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

(GIT_INDEX_FILE=some-non-existent-file \
git ls-files --exclude-standard --others --directory --ignored -z) |
xargs -0 git rm --cached -r --ignore-unmatch --

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

Тут використовується трюк - створити неіснуючий індексний файл для git ls-файлів, щоб він міг відслідковувати файли. Код оболонки вище запитує всі файли, які були б ігноровані, якби індекс був порожнім, а потім видаляє їх із фактичного індексу за допомогою git rm.

Після того, як файли були "не відстежені", використовуйте статус git, щоб переконатися, що нічого важливого не було видалено (якщо так, відрегулюйте шаблони виключення та використовуйте скидання git - шлях до відновлення видаленого запису індексу). Потім зробіть нове зобов’язання, яке не залишає "сирого".

"Сирий" все ще буде в будь-яких старих комісіях. Ви можете використовувати фільтр-гілку git для створення чистих версій старих комітетів, якщо вам справді потрібна чиста історія (nb, використовуючи git filter-branch, "перепише історію", тому її не слід сприймати з легкістю, якщо у вас є співробітники, які витягнули будь-який із ваших історичних зобов’язань після введення «сироїди»).


звучить як міцне рішення :) Я припускаю, що це для оболонки Linux так? на жаль, я користувач Win7. Як я можу це зробити у Windows?
Тохід

0

Видаліть файли з області постановки

git reset HEAD .

Додайте всі зміни

git add .

Здійснити це:

git commit -m ".gitignore is now working"

-1

Я думаю, що це простий спосіб додати файл .gitignore до наявного сховища.

Необхідна умова :

Вам потрібен браузер для доступу до вашого облікового запису github.

Кроки

  1. Створіть новий файл у своєму необхідному (існуючому) проекті та назви його .gitignore . Як тільки ви назвете файл як .gitignore, ви отримаєте підказку для шаблонів .gitignore . Або використовуйте ці шаблони або використовуйте gitignore.io для створення вмісту вашого файлу gitignore .
  2. Внесіть зміни.
  3. Тепер клонуйте це сховище.

Весело!


-3

Використовуйте git clean
Отримати довідку щодо цього запуску

git clean -h

Якщо ви хочете побачити, що станеться спочатку, переконайтесь, що перейдіть до -n перемикача для сухого пробігу:

git clean -xn

Щоб прибрати непотрібне сміття

git clean -xdf

Обережно: Ви можете ігнорувати локальні файли конфігурації, такі як database.yml, які також будуть видалені. Використовуйте на свій страх і ризик.

Тоді

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