использование gitignore для игнорирования (но не удаления) файлов - PullRequest
91 голосов
/ 11 июня 2011

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

Ответы [ 5 ]

170 голосов
/ 08 мая 2013

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

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

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

11 голосов
/ 11 июня 2011

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

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

Для предотвращения удаления друг на друга хранилища вы можете:

  • (очевидно) резервное копирование файлов куда-нибудь, извлечение изменений и восстановление файлов,
  • или также git rm --cached файлы и передайте перед тем, как потянет ваши изменения. Git удачно объединит два удаления, не касаясь уже неотслеживаемых файлов.
7 голосов
/ 11 июня 2011

Поместите / в конец имени каталога в вашем файле .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работает только с индексом (ожидающие изменения более или менее).Это не влияет на рабочее дерево или состояние отслеживаемого или нет.

3 голосов
/ 25 февраля 2013

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

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

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

1 голос
/ 25 июля 2012

Звучит так, как будто вы пытаетесь отследить файл (например, 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 и измените его с настройками компьютера.

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