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

Push git branch to other repository

我有以下用例:

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

我试图将 opensource_branch 从私人 gitlab 仓库推送到 public github 仓库:

git push origin_github opensource_branch:master 

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

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

谢谢。

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

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

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

Git 基于哈希。这意味着每次提交都会保留完整性。

一个提交链接到它的 parent,这就是为什么您经常看到 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。不幸的是,这个提交有一个 parent,它是 4837aab。你不能隐藏它,也不能告诉 Git 不要推送之前的所有历史记录。

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

一个解决方案是使提交 978e43c 成为孤儿,换句话说:没有 parent。

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