在Git中维护自定义分支(隐藏文件)

时间:2018-01-09 16:25:19

标签: git version-control

我正在尝试实现一个描述为&#34的用例;维护一个带有上游repo定制的分支"在此页面中:https://gist.github.com/rvl/c3f156e117e22a25f242

简而言之,我想将我的代码推送到3个不同的位置 - 一个位置,以及两个删节版本。我将仅对 master 进行修改,然后合并到分支中。我试图通过具有不同远程URL的3个不同分支来做到这一点,除了我想隐藏分支1和1的一些文件。 2:

master - >内部回购

分支1 - >远程#1(不包括文件A)

分支2 - >远程#2(不包括文件B)

我已经设置了遥控器。我知道如何分支 master 并将其远程设置为其他东西。我担心的是从每个分支的历史记录中删除完全的单个文件。我之前使用过 git filter-branch 但有一些顾虑:

  1. 我最终会从每个分支中删除文件A吗?是否可以仅从分支1中删除文件A而从分支2中删除文件B的方式是不可能从历史记录中删除它?

  2. master 合并到每个分支时会发生什么?它会拉文件A和B吗?是否可以为每个分支设置.gitignore?

  3. 有没有更好的方法来实现我想要做的事情?单独的文件A和B的回购?

1 个答案:

答案 0 :(得分:0)

对于你的问题:

1。您可以使用git filter-branch仅重写一个分支。例如仅在branch1中删除fileA,仅在branch2中删除文件B.

详细说明如下步骤:

  • 删除fileA中的branch1

    首先,按branch1获取git log branch1 --oneline的第一次提交。它将在branch1上列出提交,如下所示:

    commitN message N
    …
    commit2  mesaage2
    commit1 message1
    

    底部branch1的第一次提交和branch1的最新提交位于顶部。因此,您需要获取commit1的提交ID。

    然后,通过

    删除fileA中的branch1
    git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch fileA' --prune-empty -f -- commit1..branch1
    

    现在fileA完全删除branch1

  • 删除fileB中的branch2(使用相同的方法):

    首先,按commitb1获取branch2的第一次提交(假设为git log branch2 --oneline)。

    然后,删除branch2中的fileB

    git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch fileB' --prune-empty -f -- commitb1..branch2
    

2。你应该在branch1和branch2中分别添加.gitignore

master分别合并到branch1branch2时,fileAfileB将会被单独添加。因此,您应该在合并前分别为.gitignorebranch1添加branch2个文件:

git checkout branch1
touch .gitignore
echo fileA >> .gitignore
git add .gitignore
git commit -m 'add .gitignore for branch1'
git checkout branch2
touch .gitignore
echo fileB >> .gitignore
git add .gitignore
git commit -m 'add .gitignore for branch2'

现在您可以将master合并到branch1branch2,而fileAfileB将不会添加到branch1和{ {1}}分开。

此外,在单独的回购中管理branch2fileA是不必要的。以下方式可以更好地达到要求。