【问题标题】:Push git branch to other repository将 git 分支推送到其他仓库
【发布时间】:2019-07-29 07:22:42
【问题描述】:

我有以下用例:

我们有一个私有的 gitlab 存储库,并希望推送到公共的 github 存储库以将其开源。但是私有仓库和公共仓库应该包含一些文件的不同版本。例如。不同的文档等...

我已尝试将 opensource_branch 从私有 gitlab 存储库推送到公共 github 存储库:

git push origin_github opensource_branch:master 

但结果是之前的所有其他历史提交也被推送(其中包含不应公开的文档)。

任何想法如何在不手动复制和粘贴的情况下解决这个问题?

谢谢。

PS:我当然搜索过类似的用例,但没有找到这个。关于推送到其他遥控器的所有其他问题都没有要求特定的历史提交在遥控器上根本不可见。

【问题讨论】:

    标签: git repository git-branch git-push git-remote


    【解决方案1】:

    Git 基于哈希。这意味着完整性与每次提交一起保留。

    一个提交链接到它的父提交,这就是为什么你经常看到带有箭头的 Git 日志图表指向上一个提交(这看起来不直观)。在你的情况下,你可能有这样的历史:

    $ git log --graph --oneline
    * f329c58 Fix (HEAD -> master)
    * 9d13dc2 Another fix 
    * 5641ac5 Spelling
    * 978e43c Remove private documentation 
    * 4837aab Fix code
    ...
    * 1bcd23a Initial commit
    

    你要推送到远程仓库的只是来自978e43c。不幸的是,这个提交的父级是4837aab。你不能隐藏它,也不能告诉 Git 不要推送所有历史记录。

    解决方案 1:在孤立分支上变基

    一种解决方案是让提交978e43c 成为孤儿,换一种说法:没有父母。

    git checkout --orphan public
    git rm -rf . # Clear the working directory
    git commit --allow-empty -m "Initial commit"
    git rebase master..978e43c 
    

    然后您将拥有一个全新的分支,其中不包含您的私人文档。

    此解决方案有效,但有几个缺点:

    解决方案 2:使用 git filter-branch 更改历史记录

    您可以简单地从整个历史记录中删除您的敏感文档:

    export PRIVATE ./documentation/private-api
    
    git filter-branch -f \
        --prune-empty \
        --tag-name-filter cat \
        --tree-filter 'rm -rf $PRIVATE' \
        -- --all
    

    【讨论】:

      【解决方案2】:

      您可以从 opensource_branch 创建一个新分支,而无需继承其提交。 git checkout 有一个选项 --orphan 来创建这样的分支。删除私有文件和文件夹,提交然后推送。

      git checkout --orphan new_branch opensource_branch
      # delete the private files
      git rm -rf <private_folders_files>
      git commit -m 'the first commit of new_branch'
      # publish new_branch to github
      git push origin_github new_branch:master 
      

      如果您将来要将来自 opensource_branch 的提交应用到 new_branch,请注意不要引入私有文件。

      【讨论】:

      • 感谢ElpieKay,但是好像没有git branch --orphan 命令。 nowox 没看错,它是 git checkout --orphan。
      • @Darko 抱歉,我打错了。它应该是 git checkout 而不是 git branch
      【解决方案3】:

      不确定这是否能解决您的确切问题,但您可以在推送后尝试压缩提交?

      【讨论】:

      • 这只是将多个提交压缩为一个,它不会从存储库中删除私有文档。
      • 哦,抱歉。我误读了您的帖子,并认为您的问题是有人可以查看提交历史以查看已删除/删除的私人文档。
      猜你喜欢
      • 2017-07-19
      • 2018-01-27
      • 1970-01-01
      • 2010-11-07
      • 2022-08-20
      • 1970-01-01
      • 1970-01-01
      • 2013-01-04
      • 2016-04-23
      相关资源
      最近更新 更多