Git исключает файл для ветки
Я хочу игнорировать определенные файлы в ветке, не полагаясь на отслеживаемый .gitignore
файл, который будет перезаписан во время слияния с другими ветвями.
Я внимательно следил за ответом на переполнение стека вместе с связанным сообщением в блоге, но мое репо, похоже, не распознает указанный excludesfile
в моем .git/config
. Документация Git (git-config
, gitignore
), похоже, не показывает, как указать и указать файл исключений для конкретной ветки.
Мой .git/config
выглядит следующим образом:
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
excludesfile = +/info/exclude
[branch "myspecialbranch"]
excludesfile = +/info/exclude_specialbranch
Мой .git/info/exclude
файл выглядит так (по умолчанию я его не трогал):
# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~
.DS_Store
У меня нет файла .gitignore
в моем "специальном разделе".
Если я пытаюсь игнорировать файл типа info.php
, мой файл .git/info/exclude_specialbranch
выглядит следующим образом:
info.php
... но он не игнорирует файл.
Если я запустил git status --ignored
, он отображает только файл .DS_Store
из файла exclude
по умолчанию.
Однако, если я добавлю info.php
в мой файл .git/info/exclude
:
# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~
.DS_Store
info.php
он отлично игнорирует файл.
Обратите внимание, что он по-прежнему работает без строки excludesfile = +/info/exclude
под [core]
в .git/config
. Git, кажется, знает, где общесистемный exclude
без меня должен сказать это.
У меня такое ощущение, что .git/config
не распознает адрес моего пользовательского исключающего файла:
excludesfile = +/info/exclude_specialbranch
... скорее всего, из-за использования +
для описания местоположения каталога .git
.
Каков правильный метод для обращения к пользовательским файлам исключений в (более поздних) версиях Git?
Im работает с OSX 10.9.5 и Git версии 2.2.1.
Ответы
Ответ 1
Git не поддерживает per-branch исключает файлы
Вы пытаетесь достичь чего-то, что Git не поддерживает. Сообщение сообщение в блоге является исходным источником этого обмана, который ответ на переполнение стека повторила. Как отмечалось в комментариях к этому ответу, даже исходное сообщение в блоге содержит дискуссию о том, что решение не работает, и оно ссылается на новое сообщение в блоге, который упоминает, что даже автор неспособен воспроизвести поведение.
Почему это не работает? Если вы читаете man gitignore
и man git-config
, вы найдете только core.excludesfile
ссылку. Нет branch.<name>.excludesfile
. core.excludesfile
предназначен для того, чтобы вы могли исключить, например, Vim.swp или другие временные файлы, используемые вашим программным обеспечением.
core.excludesfile
В дополнение к .gitignore
(для каждого каталога) и .git/info/exclude
, Git просматривает этот файл для шаблонов файлов, которые не предназначены для отслеживания. "~/
" расширяется до значения $HOME
и "~user/
" в указанный домашний каталог пользователей. Его значение по умолчанию - $XDG_CONFIG_HOME/git/ignore
. Если $XDG_CONFIG_HOME
либо не задан, либо пуст, вместо него используется $HOME/.config/git/ignore
. См. gitignore (5).
Работа вокруг
Я считаю, что наилучшая аппроксимация исключаемого файла для каждой ветки достигается с помощью post-checkout hook и реализации .gitignore
через символическую ссылку.
Каждая ветвь будет иметь, например, a .gitignores
с файлами, названными после соответствующих ветвей. Тогда будет файл .gitignores/__default
, который будет использоваться по умолчанию. .gitignore
будет исключен из всех исключаемых файлов и будет создан крюком после проверки в качестве символической ссылки на соответствующий файл в .gitignores
.
Если вы не хотите отслеживать исключаемые файлы, вы можете сделать то же самое с файлом .git/info/exclude
в качестве символической ссылки на .git/info/excludes/__default
и т.д.