использование gitignore для игнорирования (но не удаления) файлов

В моем git-репозитории есть каталог tmp, который я хотел бы по-прежнему существовать, но меня игнорируют. Я добавил его в .gitignore, но git status до сих пор говорит мне об изменениях файлов в этом каталоге. Я попытался git rm -r --cached, но это удаляет его из удаленного репо. Как я могу остановить отслеживание изменений в этом каталоге, но все же позволить ему существовать? Мне также нужно сделать это для 1 файла, но изменения в этом также отображаются в git status после .gitignore их. Что мне делать?

86 голосов | спросил 21312312 11 J0000006Europe/Moscow 2011, 20:40:09

5 ответов


0

Вместо .gitignore вы можете обновить локальный репозиторий git, выполнив следующую команду:

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

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

ответил ducin 8 Maypm13 2013, 17:31:55
0

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

Но ваша проблема в том, что git уже отслеживает файлы, которые вы хотите игнорировать, и .gitignore не применяется к отслеживаемым файлам. Единственный способ остановить это отслеживание - сказать git удалить их. Используя git rm --cached, вы запрещаете git удалять ваши локальные файлы, но любой другой репозиторий, получивший ваши изменения, будет применять удаление. Я не думаю, что есть способ избежать этого из вашего собственного хранилища. Вы должны что-то сделать в других репозиториях или принять, что файлы будут удалены.

Чтобы предотвратить удаление друг друга в хранилище, вы можете:

  • (очевидно) сделайте резервную копию файлов, извлеките изменения и восстановите файлы,
  • или также git rm --cached и передайте перед изменениями. Git удачно объединит два удаления, не касаясь уже неотслеживаемых файлов.
ответил Michaël Witrant 11 J0000006Europe/Moscow 2011, 22:03:01
0

Поместите / в конец имени каталога в вашем .gitignore файл, т.е.

tmp/

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

git rm -rf ./tmp/
git commit -m "untrack tmp dir"
mkdir tmp
echo tmp/ >> .gitignore
git add .gitignore ; git commit -m "add tmp/ to ignore list"

Новые файлы в этом каталоге не будут отслеживаться.

Опция --cached для git rm работает только с индексом (ожидающие изменения более или менее). Это не влияет на рабочее дерево или состояние отслеживаемого или нет.

ответил Mat 11 J0000006Europe/Moscow 2011, 20:43:28
0

.gitignore не влияет на отслеживаемые файлы.

Вам нужно установить бит предположения неизменности для файлов в каталоге tmp /. Здесь есть хорошее объяснение, как это сделать: Git: распаковать файл только в локальном репо и сохранить его в удаленном репо

Кроме того, одна строка для установки предположения неизменной для всех файлов в каталоге - git update-index --assume-неизменен в каталоге .

ответил Gabe Kopley 25 FebruaryEurope/MoscowbMon, 25 Feb 2013 22:21:31 +0400000000pmMon, 25 Feb 2013 22:21:31 +040013 2013, 22:21:31
0

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

Насколько я понимаю, git не может этого сделать. Вы можете отслеживать файл, или нет. Если вы отслеживаете файл, он существует в удаленном репо и изменяется, когда вы фиксируете изменения в нем. Если вы не отслеживаете файл, он не существует в удаленном хранилище.

Поскольку с git невозможно сделать именно то, что вам нужно, потенциально могут быть другие решения, в зависимости от вашей конкретной ситуации. Например, почему вы не хотите, чтобы index.php изменялся на удаленном компьютере, когда вы меняете его локально? Есть ли в файле пользовательские настройки? Если это так, вы можете сделать:

cp index.php index_template.php
git rm --cached index.php

Теперь отредактируйте файл index_template.php так, чтобы он отображался в удаленном репо. Добавьте что-нибудь в ваш README, чтобы сообщить людям, использующим ваш репозиторий, что после клонирования они должны скопировать index_template.php в index.php и отредактировать его в соответствии со своими потребностями.

git add index_template.php
git add README
git commit -m 'added template index.php file'
git push

Когда кто-то клонирует ваш репозиторий, он должен создать свой собственный index.php. Вы упростили им задачу: просто скопируйте index_template.php в index.php и измените его с настройками компьютера.

ответил Cypress Frankenfeld 25 J000000Wednesday12 2012, 00:37:50

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132