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 и т.д.