我有以下用例:
我们有一个专用的gitlab
存储库,并希望推送到公共github
仓库以对其进行开源。但是私有存储库和公共存储库应包含某些文件的不同版本。例如。其他文档等...
我试图将opensource_branch从私有gitlab
仓库推送到公共github
仓库:
git push origin_github opensource_branch:master
但是结果是之前的所有其他历史提交也被推送了(其中包含不应公开的文档)。
有什么想法可以解决这个问题,而无需一直手动复制和粘贴吗?
谢谢。
PS:我当然在SO中搜索了类似的用例,但没有找到确切的用例。关于推送到其他遥控器的所有其他问题都没有要求特定的历史提交根本不在遥控器上可见。
答案 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之前不推送所有历史记录。
一种解决方案是使提交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
答案 2 :(得分:0)
不确定这是否可以解决您的确切问题,但是您可以在推送后尝试压缩提交?