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

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

Ответ 1

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

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

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

Ответ 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 и переустановите его с помощью определенных для компьютера настроек.