我有以下用例:
我们有一个私人gitlab
存储库,并希望推动公共github
回购开源它。但私有存储库和公共存储库应包含某些文件的不同版本。例如。不同的文档等...
我试图将opensource_branch从私人gitlab
回购推送到公共github
回购:
git push origin_github opensource_branch:master
但结果是之前的所有其他历史提交也被推送(其中包含不公开的文档)。
任何想法如何解决这个问题,而无需一直手动复制和粘贴?
谢谢。
PS:我当然搜索了类似的用例,但没有找到这个。关于推送到其他遥控器的每个其他问题都没有要求在遥控器上根本看不到特定的历史性提交。
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也不要推翻所有的历史。
一种解决方案是使提交978e43c
成为一个孤儿,换句话说:没有父母。
git checkout --orphan public
git rm -rf . # Clear the working directory
git commit --allow-empty -m "Initial commit"
git rebase master..978e43c
然后你将有一个全新的分支,不包括你的私人文档。
此解决方案有效,但它有几个缺点:
git filter-branch
改变历史您可以使用以下命令从整个历史记录中删除敏感文档:
export PRIVATE ./documentation/private-api
git filter-branch -f \
--prune-empty \
--tag-name-filter cat \
--tree-filter 'rm -rf $PRIVATE' \
-- --all
您可以从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,请注意不要引入私有文件。
不确定这是否会解决您的确切问题,但您可以尝试在推送后压缩提交?