У меня есть tmp-каталог в моем репозитории git, я бы хотел все еще существовать, но его можно игнорировать. Я добавил его в .gitignore
, но git status
все еще рассказывает мне об изменениях в файлах в этом каталоге. Я пробовал git rm -r --cached
, но удаляет его из удаленного репо. Как я могу остановить отслеживание изменений в этом каталоге, но все же позволить ему существовать? Мне также нужно сделать это для 1 файла, но изменения в этом также отображаются в git status
после .gitignore
их. Что мне делать?
Использование gitignore для игнорирования (но не удаления) файлов
Ответ 1
Вместо .gitignore
вы можете обновить локальный репозиторий git, выполнив следующую команду:
git update-index --assume-unchanged <file>
В этом случае файл отслеживается в исходном репо. Вы можете изменить его в своем локальном репо, а git никогда не будет отмечать его как измененное. Читайте больше на:
- http://blog.pagebakers.nl/2009/01/29/git-ignoring-changes-in-tracked-files/ - в какой-то момент сообщалось о смерти (извините, а не мое).
- http://archive.robwilkerson.org/2010/03/02/git-tip-ignore-changes-to-tracked-files/ - другой, охватывающий ту же тему
Ответ 2
Игнорирование изменений, внесенных в файлы, позволяя им существовать, является точной целью .gitignore
. Поэтому добавление файлов (или каталогов) в .gitignore
- единственное, что вам нужно сделать.
Но ваша проблема в том, что git уже отслеживает файлы, которые вы хотите игнорировать, и .gitignore
не относится к отслеживаемым файлам. Единственный способ остановить это отслеживание - сообщить git удалить их. Используя git rm --cached
, вы предотвращаете удаление git локальных файлов, но любой другой репозиторий, получающий ваши изменения, применит удаление. Я не думаю, что есть способ избежать этого из вашего собственного репозитория. Вы должны что-то сделать в других репозиториях или принять файлы будут удалены.
Чтобы предотвратить удаление репозитория друг от друга, вы можете:
- (очевидно) резервное копирование файлов где-то, извлечение изменений и восстановление файлов,
- а также
git rm --cached
файлы и зафиксировать до, потянув за ваши изменения. git будет приятно объединять два удаления, не касаясь уже не отслеженных файлов.
Ответ 3
Поместите a /
в конец имени каталога в файле .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
работает только с индексом (ожидающие изменения более или менее). Это не влияет на рабочее дерево или на статус отслеживаемых или нет.
Ответ 4
.gitignore не влияет на отслеживаемые файлы.
Вы хотите установить бит unbeanged для файлов в каталоге tmp/. Там есть хорошее объяснение, как это сделать: Git: отменить файл только в локальном репо и сохранить его в удаленном репозитории
Кроме того, однострочные установки для установки принимают без изменений на всех файлах в каталоге - git update-index -assume-unchanged в каталоге.
Ответ 5
Похоже, вы пытаетесь отследить файл (например, 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
и переустановите его с помощью определенных для компьютера настроек.