Git игнорировать файлы, отслеживаемые БЕЗ УДАЛЕНИЯ ИХ - программирование
Подтвердить что ты не робот

Git игнорировать файлы, отслеживаемые БЕЗ УДАЛЕНИЯ ИХ

У меня возникли проблемы с пониманием основных концепций git:/

Я тестирую свою локальную машину Windows, прежде чем пытаться выполнить некоторые действия на моем git -контролированном сайте.

У меня есть:

gittesting/repo1:
    file.txt
    ignoreme:
        ignore.txt

и

gittesting/repo2
    file.txt
    ignoreme:
        ignore.txt

Repo2 - это копия repo1, и ignoreme уже отслеживается. Файл ignore.txt изменяется в repo2, но я хочу прекратить его отслеживать и git полностью игнорировать его. Проблема в том, что если я создаю файл .gitignore и добавляю ignoreme, это слишком поздно, потому что он уже отслеживается, поэтому мне придется делать git rm --cached ignore, но затем он помечается как удаленный, и если я вытащил commit для repo1, каталог будет удален, а не оставлен в покое.

Подводя итог:

  • В файле ignore.txt имеется различное содержимое между двумя репозиториями.
  • Я хочу, чтобы содержимое ignore.txt оставалось таким, каким оно есть, и полностью игнорируется git

Я посмотрел онлайн, спросил в IRC, и посмотрел на очень связанные вопросы, но не могу найти способ сделать это. Я знаю, что пример кажется тривиальным, но это именно то, что мне нужно сделать на моем сайте, где вместо этого находится каталог/кеш.


изменить:

Это немного взломать, и я предпочел бы лучший ответ, но я закончил:

cd repo2
echo "ignoreme" > .gitignore
echo "ignoreme/*" > .gitignore
git rm --cache -r ignoreme
git commit -m "Should ignore now"
cd ../repo1
mv ignoreme ignoreme2
git pull ../repo2
mv ignoreme2 ignoreme
4b9b3361

Ответ 1

Если я правильно понял ваш вопрос, вы хотите, чтобы repo2 знал о каталоге ignoreme/, но вы не хотите, чтобы Git заботился о любых изменениях в каталоге. И git rm --cached не поможет вам, потому что вы сообщаете Git, чтобы остановить отслеживание этого содержимого с этого момента.

Git решение для отслеживания содержимого, но фиксированное в определенной точке, происходит через подмодули. Это за исключением Git Book объясняет (выделено мной):

Хотя rack является подкаталогом в вашем рабочем каталоге, Git видит его как подмодуль, а не отслеживает его содержимое, когда вы не находитесь в этом каталоге. Вместо этого Git записывает его как конкретную фиксацию из этого репозитория.

Вы можете попробовать следующее:

  • Скопируйте каталог ignoreme/ в новое место и сделайте его хранилищем Git

  • Добавьте его обратно как подмодуль в repo2:

    git submodule add file:///path/to/ignoreme ignoreme
    git commit -m"Add ignoreme/ as a submodule"
    

Подмодуль ignoreme теперь привязан к определенной фиксации. repo2 по-прежнему отслеживает содержимое внутри субмодуля, но любые изменения в файлах в ignoreme/ не будут отслеживаться в repo2, если вы не зафиксируете их в подмодуле. Скажем, ignoreme/ignore.txt было каким-то образом изменено:

$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#   (commit or discard the untracked or modified content in submodules)
#
#       modified:   ignoreme (modified content)
#
no changes added to commit (use "git add" and/or "git commit -a")

Даже если вы запустите git add ., изменения в ignoreme/ignore.txt не будут добавлены в индекс, если они не будут привязаны к подмодулю:

$ cd ignoreme
$ git commit -am"Time to change ignore.txt"
$ cd ..
$ git add .
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   ignoreme
#

Однако, если вы хотите забыть локальные модификации в подмодуле:

$ cd ignoreme
$ git reset --hard
$ cd ..

Ответ 2

Попробуйте это

git update-index --assume-unchanged ignoreme/ignore.txt

Git будет игнорировать любые будущие изменения этого файла без изменения репозитория. Чтобы снова начать отслеживание изменений, используйте

git update-index --no-assume-unchanged ignoreme/ignore.txt

Обратите внимание, что это действует только для текущей рабочей копии, поэтому вам нужно будет делать это каждый раз, когда вы клонируете репозиторий.

Ответ 3

Git не хранит каталоги. Если вы хотите сохранить пустой каталог в Git, соглашение состоит в том, чтобы поместить туда пустой файл с именем .keepme и зафиксировать его.

Что касается вопроса, вы не сможете скрыть файл в ветке вверх по течению от своего клона, насколько мне известно. Это не то, что предназначено для Git. Рассмотрим другие варианты, такие как разделение на два репозитория (и, возможно, использование поддерева или подмодулей). Или сохраните отдельную ветку в восходящем потоке, чтобы отслеживать ее вниз по течению, и отфильтруйте ignore.txt из этой ветки с помощью крюка после приема.

Расскажите нам больше о том, почему вы хотите это сделать, может быть, есть лучший способ.

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

Ответ 4

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

Вы можете сделать файл символической ссылкой на какую-либо территорию за пределами Git, что делает восстановление от урона простым проверкой плохой истории. Если это не опция, то фильтр-ветвь.

Ответ 5

Git применяется только к игнорируемым файлам. Вы не можете использовать шаблоны игнорирования, чтобы игнорировать изменения в файлах, которые уже отслеживаются с помощью git. Тем не менее, см. https://gist.github.com/1423106, чтобы люди работали над проблемой.

Обратите внимание, что если вас беспокоит сама .gitignore, вы можете попробовать использовать .git/info/исключает только файл .gitignore с локальным репо. Обратите внимание, что это не решит проблему смены отслеживаемых файлов, а даст вам дополнительные .gitignores, которые не будут отслеживаться.