Ігнорування вмісту вже зареєстрованого каталогу?


227

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

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

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

Як змусити git забути про цільовий каталог?


Що таке ім'я каталогу і що б ви поклали в .gitignore
мммммм

1
Ім'я є DirNameIrrelevant і в .gitignore Я намагався поставити "DirNameIrrelevant", "DirNameIrrelevant /" та "DirNameIrrelevant / *"
Felixyz

Відповіді:


524

Ця команда призведе до того, що git скасовує ваш каталог та всі файли під ним, не фактично видаляючи їх:

git rm -r --cached <your directory>

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

Цей --cachedпараметр призводить до того, що файли видаляються лише з індексу git, а не з вашої робочої копії. За замовчуванням git rm <file>буде видалено <file>.


Ах, дякую. Дуже корисно, хоча я не розумію, чому це повинно бути необхідним (чому цього недостатньо, щоб додати dir в .gitignore?). Не могли б ви сказати, для чого призначений кеш?
Феліксиз

впевнений. Я змінив свою відповідь, щоб описати два варіанти.
Гордон Вілсон,

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

15
Gitignore використовується для визначення того, про що будуть невідомі файли git; це не стосується файлів, які вже відстежуються. Якщо користувач хоче відслідковувати файли, відібрані в іншому випадку, git дозволяє їм. Це можна зробити, використовуючи, add -fабо бути вашою ситуацією. Як сказав Гордон, це запобігає випадковому витиранню купи файлів - сховище - це головний список, а не gitignore. Це також дозволяє вам вручну відстежувати декілька речей, які в іншому випадку ігноруються правилом, що я вважаю корисним.
Каскабель

-rваріант не «викликає видалити всі файли в директорії» , а скоріше через рекурсію в підкаталогах.
MrE

78

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

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

Після цього будь-які зміни цього файлу більше не відображатимуться в git status.


1
Хоча ОП, можливо, попросив каталог, саме це я шукав - ігнорування подальших змін до одного зареєстрованого файлу; Дякую!
sdaau

1
щоб ігнорувати каталог, повністю використовуйте 'git update-index --assume-unchanged dirName / *'. Мені знадобилося деякий час, щоб знайти синтаксис, "*" тут потрібен
J-Dizzle

1
Як можна було б це змінити?
Rhys

3
@Rhys, щоб змінити його:git update-index --no-assume-unchanged dirname/**/*
JobJob

3

Для підкаталогу, який називається blah/доданим до git, обидва наступні, здається, працюють, щоб ігнорувати нові файли в blah/. Додано до .gitignore:

blah 
blah/*

1

TL; DR, щоб очистити ваше сховище git і переконатися, що ВСІ ваші ігноровані елементи дійсно ігноруються:

git rm -r --cached .
git add .
git commit -m "Clean up ignored files"

Примітка: вам не потрібно вказувати каталог, таким чином ви очищаєте всю віддалену репо .

Щоб піти далі, прочитайте це


0

Не впевнений, чи вважає це чи робить мене поганою людиною, але ось так.

  1. Я додав *Generated*до кореневого файлу .gitignore
  2. Я подав файли, які хочу зберегти як GeneratedFile.Wwhat.ext. Перевірено
  3. Я зробив гак на git під час реєстрації, щоб зателефонувати скрипту повноважень:

dir *.CheckedIn -Recurse | %{ copy $_.FullName "$($_.FullName)".Replace("CheckedIn","") -EA SilentlyContinue}

Я дуже погано себе почуваю ... але насправді це працює.


-2

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

Принаймні, це спрацювало для мене в цій ситуації. Все-таки було б чудово, якби хто-небудь міг би дати більше розуміння того, що відбувається.


1
Коротка версія того, що ми говорили в іншому місці - gitignore впливає на те, про що будуть невідомі дані про git. Це не впливає на те, що буде зроблено з даними, про які ви їм розповіли (наприклад, направили його на додавання до сховища).
Каскабель

Отже, є сенс, що файли, які відслідковувались та видаляються зараз, слід відслідковувати як такі, але для мене все ще не має сенсу, що додані файли (якщо це зроблено до наступного комітету) відслідковуються, тоді як якщо я 1) ігнорувати, 2) видаляти файли, 3) фіксувати, 4) додавати новий файл, нові файли не відслідковуються.
Феліксиз
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.