Как отменить git добавить -f? - PullRequest
0 голосов
/ 03 мая 2019

У меня есть папка .idea/ в моем хранилище, и она находится в списке .gitignore.

По какой-то причине я использовал git add .idea/ -f, чтобы заставить git добавить папку .idea в свои репозитории.

Я просто хочу сделать это один раз.

Но я обнаружил, что когда я использую git add . в другое время, git все еще добавляет изменения .idea в мой репозиторий. Это не мое желание, как решить это?

Ответы [ 3 ]

2 голосов
/ 03 мая 2019

Помните, что Git в основном делает new коммитов.Чтобы сделать новый коммит, вы, как правило, запустите git commit.При этом используются все файлы из индекса .Файлы, которые находятся в индексе:

  • Те, которые были в индексе, когда вы начали, и все еще там, потому что вы не изменили их с тех пор: они попали туда, потому что вы запустилиgit checkout некоторого существующего коммита.

  • Те, что сейчас в индексе, потому что вы запустили git add <em>file</em>.Это скопировало файл file из вашего рабочего дерева в ваш индекс.Если раньше в индексе была копия file (потому что она была в коммите, который вы извлекли), то теперь в индексе есть другая копия.Если не было файла с именем file в индексе раньше (по любой причине), то теперь - это .

Индекс также называется областью подготовки .Когда вы используете git status, Git сравнивает содержимое индекса с HEAD (текущим) содержимым коммита и сообщает вам, что отличается , говоря, что это изменения, подготовленные для коммита .

Файлы в индексе называются отслеженные файлы.

Удаление отслеженной копии файла

Вы можете использовать git rm --cached <em>file</em> для удаления index копия любого файла, не касаясь work-tree копии этого файла.Так что, если .idea/somefile находится в индексе прямо сейчас , вы можете удалить его с помощью git rm --cached .idea/somefile.Вы можете удалить все файлы в индексе, которые начинаются с .idea/, используя git rm -r --cached .idea: это не коснется вашего рабочего дерева (где вы можете просматривать свои файлы и работать с ними), но удалит все .idea/* и .idea/**/* файлы из индекса.

Старые коммиты не изменятся;это представляет новую опасность

Независимо от того, что вы делаете сейчас , любой коммит, в котором было .idea/somefile, будет иметь .idea/somefile в дальнейшем.Этот коммит нельзя изменить; самое большее, что вы можете сделать, это прекратить его использовать.Например, вы можете сделать новый и улучшенный коммит, который имеет все те же файлы в тех же версиях, за исключением , в котором пропущено .idea/somefile.Затем вместо исходного коммита (в котором по-прежнему содержится .idea/somefile) вы используете новый коммит (которого нет), поэтому Git не пытается создать .idea/somefile при извлечении нового коммита.

Но предположим, что вы do проверили старый коммит.Когда вы сделаете это, .idea/somefile будет в этого старого коммита.Этот файл будет скопирован в ваш индекс (так что .idea/somefile теперь возвращается в индекс ) и в ваше рабочее дерево (так что .idea/somefile в вашем рабочем деревебыл заменен сохраненным из коммита).Если вы теперь решите переключиться со старого коммита обратно на новый коммит, который не имеет .idea/somefile, Git увидит, что .idea/somefile находится в вашем индексе и в вашемрабочее дерево, и что эти два соответствуют файлу в коммите, от которого вы удаляетесь.Так что Git удалит .idea/somefile из и ваш индекс и вашего рабочего дерева и перейдет к новому коммиту.

Если эти файлыявляются важными и трудными для восстановления, вы должны стать очень осторожными при посещении исторических коммитов с файлами, как только вы сделали новые коммиты, которые не сохраняют эти файлы.Например, вы можете захотеть сначала удалить каталог .idea («папка») рабочего дерева, чтобы при извлечении Git старого коммита он создавал новый .idea, который вы можете удалить, когда вывернуться к новым коммитам.

Обратите внимание, что Git вообще не хранит каталоги.Git хранит только файлы - и не по отдельности, а только внутри одного или нескольких коммитов.Всякий раз, когда вы извлекаете коммит, содержащий файл с именем .idea/somefile, Git извлекает его , создает .idea/, если это необходимо.Но .idea/ само по себе не в Git, просто .idea/somefile.

1 голос
/ 03 мая 2019

Удалить .idea / из кеша git:

$ git rm -r --cached .idea

Убедитесь, что .idea / добавлен в список .gitignore.Теперь git должен игнорировать каталог .idea:

$ git status
# .idea/ is ignored 
0 голосов
/ 03 мая 2019

дело в том, что .gitignore работает только для неотслеживаемых файлов.Если файлы внутри .idea уже являются частью проекта (потому что вы добавили их в предыдущих ревизиях), то git начнет сообщать вам, когда файлы будут изменены, даже если он находится внутри .gitignore.Затем вы можете сделать так, чтобы git не сообщал вам об этих файлах (при условии, что вы хотите сохранить их в истории проекта), чтобы заставить git больше не заботиться о них.Чем можно достичь с помощью git update-index --assume-unchanged.Это операция «на репо», поэтому другие разработчики должны будут делать то же самое с репо.

https://git -scm.com / docs / git-update-index

В качестве дополнительного примечания добавление метаданных, таких как файлы IDE, в проект не считается хорошей идеей, но решать вам.

...