告诉git在合并时总是忽略一些文件/文件夹

时间:2016-08-08 10:08:44

标签: git merge

假设项目有以下文件夹:

  • core
  • src

并拥有分支:mastertestbranch

src中的{p> mastersrc中的testbranch包含不同的内容。

我想在合并srcmaster时告诉git 不要合并 testbranch文件夹。

换句话说,我想只合并分支之间的core文件夹。

另外,我希望git跟通常文件一样跟踪各个分支的src文件夹。

有没有可能的解决方案?

4 个答案:

答案 0 :(得分:2)

使用.gitignore文件并在其中包含类似内容:

src/

git add -A时,Git目录中不会包含任何文件。

有关详情,请参阅git docs

编辑:您可以使用this SO回答从单个分支中排除文件,我已将其转换为函数:

exclude_file_from_branch() {
    git branch "$1"

    if [ -f .git/info/exclude_from_"$1" ]; then
        echo "$2" >> .git/info/exclude_from_"$1" 
    else
        echo "$2" > .git/info/exclude_from_"$1"
        touch .git/info/exclude_from_"$1"
    fi         

    git config core.excludesfile '+info/exclude'
    git config "$1".excludesfile '+info/info/exclude_from_"$1"'
}

git config <branchname>.excludesfile '/filepath'/filepath视为额外的.gitignore文件。该文件中的所有条目必须与.gitignore文件中的条目一样(例如,目录必须以尾部斜杠directory-example/结尾)。

然后调用您要忽略的每个文件。目录必须附加斜杠:

cd /git/directory
exclude_file_from_branch "branchname" "/path/to/file"

编辑#2 :刚刚在这里展示,这里是多个文件的重构函数:

exclude_file_from_branch() {
    git branch "$1"

    [[ -f .git/info/exclude_from_"$1" ]] && touch .git/info/exclude_from_"$1"

    for i in "${@:2}"; do
        echo "$i" >> .git/info/exclude_from_"$1" 
    done;

    git config core.excludesfile '+info/exclude'
    git config "$1".excludesfile '+info/info/exclude_from_"$1"'
}

请致电:

cd /git/directory
exclude_file_from_branch "branchname" "/path/to/file" "/some/ignored/folder/" "/as" "/many" "/as" "/you" "/want"

答案 1 :(得分:1)

根据我的经验,使用单个存储库是不可能的。您可以将git子模块用于主分支。所以你的src文件夹将作为你的git子模块。并且project文件夹将作为您的主存储库,它将包含核心以及实际上是git子模块的src文件夹。 (反之亦然)

答案 2 :(得分:0)

这是不可能的 也许您应该将coresrc拆分为不同的Git存储库,以便单独跟踪它们。

答案 3 :(得分:0)

我认为你知道自己在做什么,熟悉git概念,并且你被环境(高层管理人员或其他)强迫你这样做。这非常违反git方式。

那说......

答案

  src中的{p> mastersrc中的testbranch包含不同的内容。

然后你不应该把它们放在同一个目录里。

制作如下目录结构:

core
src_master
src_testbranch
src --> src_master

src是指向src_mastersrc_testbranch的符号链接,具体取决于您所在的分支。

现在一切都会好起来的。两个src_...目录显示在两个分支中,但您可以忽略它。您仍然可以使用src

您是否将src符号链接放在.gitignore中取决于您(取决于您实际想要实现的所有内容)取决于您自己。无论哪种方式都无关紧要。

N.B。:您不需要在分支名称之后调用src_...目录,而是根据实际存在的名称命名它们。您也可以将它们放在其他任何位置,例如dist/...vendor/...