我想忽略分支中的某些文件,而不必依赖于跟踪的.gitignore
文件,该文件将在与其他分支合并时被覆盖。
我一直在关注a Stack Overflow answer沿着the linked blog post,但我的repo似乎无法识别.git/config
中指定的excludesfile
。Git文档(git-config
,gitignore
)似乎没有说明如何为特定分支指定和寻址excludes文件。
我的.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
我的“specialbranch”中没有.gitignore
文件。
如果我尝试忽略info.php
这样的文件,.git/info/exclude_specialbranch
文件看起来如下所示:
info.php
...但不会忽略该文件。
如果我运行git status --ignored
,它只列出默认exclude
文件中的.DS_Store
文件。
但是,如果我将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
它完全忽略该文件。
请注意,在.git/config
中没有[core]
下的excludesfile = +/info/exclude
行,Git仍然可以工作。
我感觉.git/config
无法识别自定义排除文件的地址:
excludesfile = +/info/exclude_specialbranch
...很可能是因为使用+
来描述.git
目录的位置。
在Git(更新的)版本中,解决自定义排除文件的正确方法是什么?
我运行的是OSX 10.9.5和Git 2.2.1版。
2条答案
按热度按时间ryevplcw1#
Git不支持按分支排除文件
你正在尝试实现Git不支持的东西。blog post是这个恶作剧的原始来源,而the Stack Overflow answer只是模仿。正如在该答案下的评论中所指出的,即使是原始的博客文章也包含了一个讨论,指出解决方案不起作用,它链接到一个newer blog post,提到即使是作者也无法重现这种行为。
为什么它不工作?如果你读
man gitignore
和man git-config
,你会发现只有core.excludesfile
引用。没有branch.<name>.excludesfile
。core.excludesfile
是为了让你排除例如Vim .swp文件或其他临时的东西,你的软件使用。core.excludesfile
除了
.gitignore
(per-directory)和.git/info/exclude
,Git会在这个文件中查找不需要跟踪的文件模式。“~/
“会扩展为$HOME
,“~user/
“会扩展为指定用户的主目录。默认值为$XDG_CONFIG_HOME/git/ignore
。如果$XDG_CONFIG_HOME
没有设置或为空,使用$HOME/.config/git/ignore
。请参阅gitignore(5)。解决方法
我相信,使用post-checkout钩子可以获得最接近于每个分支的excludes文件,它重写了工作树中
.gitignore
的内容。*每个分支都有一个
.gitignores
目录,其中的文件以相应的分支命名。然后,默认情况下会使用一个.gitignores/__default
文件。.gitignore
会被所有的排除文件排除,并由post-checkout钩子创建为.gitignores
中相应文件的副本。如果你不想跟踪排除文件,你可以做同样的
.git/info/exclude
文件作为.git/info/excludes/__default
等的副本。j1dl9f462#
下面是我为此编写的脚本: