Игнорирование содержимого уже зарегистрированного каталога?

227

У меня есть git-репозиторий, который используется только для хранения графических и звуковых файлов, используемых в нескольких проектах. Все они находятся в одном каталоге без подкаталогов. Сейчас я только что создал скрипт для копирования этих ресурсов из другого структурированного каталога с несколькими уровнями подкаталогов.

Теперь я хочу, чтобы git отслеживала только (исходную) иерархическую файловую структуру, а плоский каталог (со всеми файлами в одной стопке) следует игнорировать.

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

Как заставить git забыть о целевом каталоге?

Felixyz
источник
Какое имя каталога и что вы положили в .gitignore
mmmmmm
1
Меня зовут DirNameIrrelevant, и в .gitignore я пытался поставить "DirNameIrrelevant", "DirNameIrrelevant /" и "DirNameIrrelevant / *"
Феликсиз

Ответы:

524

Эта команда заставит git отследить ваш каталог и все файлы в нем, фактически не удаляя их:

git rm -r --cached <your directory>

-rОпция вызывает удаление всех файлов в каталоге.

--cachedОпция заставляет файлы , которые будут удалены только из индекса GIT, а не вашей рабочей копии. По умолчанию git rm <file>удалил бы <file>.

Гордон Уилсон
источник
Ах, спасибо. Очень полезно, хотя я не понимаю, почему это необходимо (почему недостаточно добавить каталог в .gitignore?). Не могли бы вы сказать мне, для чего --cached?
Феликсиз
конечно. Я изменил свой ответ, чтобы описать два варианта.
Гордон Уилсон
Что касается того, почему это необходимо, я могу только догадываться. Я предполагаю, что создатели хотели, чтобы отслеживание файлов было явным, чтобы уменьшить риск ошибочного отслеживания важных частей вашего проекта. Я полагаю, есть и технические причины.
Гордон Уилсон
15
Gitignore используется для определения того, какие неотслеживаемые файлы будет знать git; это не имеет отношения к файлам, которые уже отслеживаются. Если пользователь хочет отследить игнорируемые файлы, git позволяет им. Это может быть сделано либо с помощью, add -fлибо в вашей ситуации. Как сказал Гордон, это удерживает вас от случайного уничтожения нескольких файлов - хранилище - это главный список, а не gitignore. Это также позволяет вам вручную отслеживать несколько вещей, которые иначе были бы проигнорированы правилом подстановочных знаков, что я нашел полезным.
Каскабель
-rвариант не «вызывает удаление всех файлов в директории» , а скорее через рекурсию в подкаталогах.
MrE
78

Если вам нужен отслеживаемый файл (зарегистрирован), но вы не хотите отслеживать дальнейшие изменения файла, сохраняя его в локальном хранилище, а также в удаленном хранилище, это можно сделать с помощью:

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

После этого любые изменения в этом файле больше не будут отображаться в git status.

Jone
источник
1
Хотя OP, возможно, запросил каталог, это именно то, что я искал - игнорирование дальнейших изменений в одном зарегистрированном файле; Спасибо!
Сдау
1
чтобы полностью игнорировать каталог, используйте 'git update-index --assume-неизмененный dirName / *'. Мне потребовалось некоторое время, чтобы найти синтаксис, здесь нужно «*»
J-Dizzle
1
Как бы это изменить?
Рис
3
@Rhys, чтобы полностью изменить это:git update-index --no-assume-unchanged dirname/**/*
JobJob
3

Для подкаталога с именем blah/добавлен в git, оба из следующих, похоже, работают, чтобы игнорировать новые файлы в blah/. Добавлено в .gitignore:

blah 
blah/*
Stef
источник
1

TL; DR, чтобы очистить ваш git-репозиторий и убедиться, что ВСЕ ваши игнорируемые элементы действительно игнорируются:

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

Примечание: вам не нужно указывать каталог, таким образом вы очищаете весь удаленный репозиторий .

Чтобы пойти дальше, прочитайте это

CED
источник
0

Не уверен, считается ли это или делает меня плохим человеком, но здесь это идет.

  1. Я добавил *Generated*в корневой файл .gitignore
  2. Я отправил файлы, которые хочу сохранить, в виде GeneratedFile.Whwhat.ext. CheckedIn
  3. Я сделал git hook при оформлении заказа, чтобы вызвать скрипт powershell, выполняя это:

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

Я чувствую себя немного плохо из-за себя ... но на самом деле это работает.

Стив
источник
-2

Хорошо, кажется, что вы должны сначала выполнить регистрацию с полностью пустым каталогом (ни старыми, ни новыми файлами), и любые добавленные после этого файлы будут игнорироваться. Если вы удаляете старые файлы, добавляете и новые перед фиксацией, новые добавляются в репозиторий, хотя их следует игнорировать.

По крайней мере, это сработало для меня в этой ситуации. Было бы замечательно, если бы кто-нибудь мог дать больше информации о том, что происходит.

Felixyz
источник
1
Короткая версия того, что мы сказали в другом месте - gitignore влияет на то, что git будет отслеживать. Это не влияет на то, что будет сделано с данными, о которых вы сказали (например, указало добавить их в хранилище).
Каскабель
Поэтому имеет смысл, что файлы, которые были отслежены и теперь удалены, должны отслеживаться как таковые, но для меня все еще не имеет смысла, что файлы, добавленные (если это сделано до следующего коммита), отслеживаются, тогда как если I 1) игнорировать, 2) удалить файлы, 3) зафиксировать, 4) добавить новый файл, новые файлы не отслеживаются.
Феликсиз