Вопрос по git, version-control – Git игнорирует отслеживаемые файлы, БЕЗ УДАЛЕНИЯ ИХ

16

У меня возникли проблемы с пониманием основных концепций 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, но тогда он будет помечен как удаленный и если я вытащу коммит на repo1, каталог будет удален, а не оставлен в покое ..

Подвести итог:

The ignore.txt have different content between the two repos. I want the ignore.txt contents to remain as they are and be completely ignored by git

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

редактировать:

Это что-то вроде хака, и я предпочел бы лучший ответ, но в итоге я сделал:

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

Ваш Ответ

5   ответов
1

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

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

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

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

Индивидуальный подход заключается в совершении пустой.gitkeep файл. Причина кроется в кратком и однозначном префиксе:.* # ignore dotfiles !.git* # but not those that configure the repository, i.e. .gitignore, .gitkeep
@AlexanderGladysh FWIW, я никогда не видел.keepme, но я видел.gitkeep и пустой.gitignore.
.keepme это широко используемая идиома. Как обычно с идиомой, вы можете пойти против зерна и сделать это по-своему, но на свой страх и риск.
Я всегда предпочитаю ставить.gitignore внутри каталога для & quot; пусто & quot; каталоги.
18

Попробуй это

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

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

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

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

Спасибо, именно то, что мне было нужно.
Это все еще изменило файл :( mowwwalker
Это не остановит изменение файла. Это просто остановит git показ файла как измененного. Если вы хотите полностью запретить изменения файла, вы можете установить его только для чтения.
С помощью--assume-unchanged только законно, если вы на самом деле не измените файл. Если вы измените это, вы лжете, чтобы мерзко, и это никогда не кончается хорошо.
@ SethRobertson. Если вы на самом деле не меняете файл, вам не нужно--assume-unchanged, Это может быть случай, когда вам нужно временно изменить параметр конфигурации, который не должен быть зафиксирован, например, в хранилище. Я согласен, что это также опасно, поскольку легко забыть об этом и избежать внесения важных изменений.
0

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

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

7

repo2 знать оignoreme/ каталог, но вы не хотите, чтобы Git заботился о любых изменениях каталога. А такжеgit rm --cached не поможет вам, потому что вы говорите Gitstop tracking this content from now on.

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

Although rack is a subdirectory in your working directory, Git sees it as a submodule and doesn’t track its contents when you’re not in that directory. Instead, Git records it as a particular commit from that repository.

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

Copy the ignoreme/ directory to a new location, and make it a git repository

Add it back as a submodule in 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 ..
0

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

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

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