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

在Git中维护自定义分支(隐藏文件),git,version-control,Git,Version Control,我正在尝试实现一个用例,该用例在本页中描述为“通过对上游回购的定制维护一个fork”: 简而言之,我想将代码推送到3个不同的位置—一个主位置和两个简化版本。我将只对master进行修改,然后合并到分支中。我正试图通过3个不同的分支和不同的远程URL来实现这一点,但我想从分支1和2隐藏一些文件: 主->内部回购 分支1->远程#1(不包括文件A) 分支2->远程#2(不包括文件B) 我已经安装好遥控器了。我知道如何分支master并将其远程设置为其他对象。我关心的是从每个分支的历史记录中完全删除单

我正在尝试实现一个用例,该用例在本页中描述为“通过对上游回购的定制维护一个fork”:

简而言之,我想将代码推送到3个不同的位置—一个主位置和两个简化版本。我将只对master进行修改,然后合并到分支中。我正试图通过3个不同的分支和不同的远程URL来实现这一点,但我想从分支1和2隐藏一些文件:

主->内部回购

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

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

我已经安装好遥控器了。我知道如何分支master并将其远程设置为其他对象。我关心的是从每个分支的历史记录中完全删除单个文件。我以前使用过git filter branch,但有一些问题:

  • 我会从每个分支删除文件吗?是否可以仅从分支1删除文件A,而从分支2删除文件B的方式无法从历史记录中获取

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

  • 有没有更好的方法来实现我的目标?文件A和文件B的单独回购?

    关于您的问题:

    1.您可以使用git筛选器分支只重写一个分支。例如,仅在branch1中删除文件A,仅在branch2中删除文件B。 具体实现步骤如下:

    commitN message N
    …
    commit2  mesaage2
    commit1 message1
    
    • branch1
      中删除
      fileA

      First,通过
      git log branch1--oneline
      branch1
      上获取第一次提交。它将列出branch1上的提交,如下所示:

      commitN message N
      …
      commit2  mesaage2
      commit1 message1
      
      branch1
      的第一次提交在底部,而
      branch1
      的最新提交在顶部。因此,您需要获取
      commit1
      的提交id

      然后,删除
      branch1
      中的
      fileA

      git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch fileA' --prune-empty -f -- commit1..branch1
      
      现在
      fileA
      branch1
      中被完全删除

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

      First,通过
      git log branch2--oneline
      获取
      branch2
      的第一次提交(假设是
      commitb1

      然后删除branch2中的文件B

      git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch fileB' --prune-empty -f -- commitb1..branch2
      
    2.您应该分别在branch1和branch2中添加.gitignore 当您将
    master
    分别合并到
    branch1
    branch2
    中时,将分别添加
    fileA
    fileB
    。因此,在合并之前,您应该分别为
    branch1
    branch2
    添加
    .gitignore
    文件:

    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
    合并到
    branch1
    branch2
    ,并且
    fileA
    fileB
    不会分别添加到
    branch1
    branch2

    此外,没有必要在单独的回购中管理
    fileA
    fileB
    。下面的方法可以更好地达到要求