将git分支推送到其他存储库

时间:2019-03-07 11:58:50

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

我有以下用例:

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

我试图将opensource_branch从私有gitlab仓库推送到公共github仓库:

git push origin_github opensource_branch:master 

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

有什么想法可以解决这个问题,而无需一直手动复制和粘贴吗?

谢谢。

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

3 个答案:

答案 0 :(得分:1)

您可以从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,请注意不要引入私有文件。

答案 1 :(得分: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 :(得分:0)

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