moe*_*oey 1 git collaboration github
我有一个github私有存储库,我在其中与其他一些(私人)协作者一起工作.我们称之为repo-a.
客户刚刚将我添加到他们的组织帐户.我需要与该组织中的其他开发人员分享我的回购.我不确定"分享"是否是正确的术语; 也许我需要"复制"?我该怎么做呢?
我希望有人可以帮助的更重要的问题是我不希望本组织看到我的私人合作者所犯的历史.但是,有希望,我将能够轻松地"推",在最新的代码回购一到组织(我仍然计划与私人合作回购一个合作者).这合理吗?
小智 6
简短的回答:不,这是不可能的.
你在这里为自己设置了很多麻烦.如果您提供的历史记录不包含实际历史记录,那么根据定义,您没有记录其版本包含的提交内容.无论如何,你将永远无法从包含"私有"提交的分支推送到不包含"私有"提交的分支.你基本上要求的历史记录如下:
- W - X - ABCD - Y - Z - EFGH - ... (public)
\ \
A - B - C - D - x - E - F - G - H (private)
Run Code Online (Sandbox Code Playgroud)
其中ABCD是包含提交A,B,C和D的更改的提交,类似地,EFGH隐藏了E,F,G和H.您可以使用git checkout public-branch; git merge --squash private-branch.squash merge执行合并,然后将其记录为常规提交,即没有合并的分支作为父级.只要您对合并非常小心,此选项可能对您有用.不过,这仍然很痛苦.(请注意,合并Y和Z会导致私有仓库中的重复提交,ABCD与ABCD.这很难看,但比替代方案更好,这是完全不同的历史记录.)
无论如何,你的历史将会发生分歧.最好的情况可能是您使用标签来帮助自己跟踪事物.例如,您可以将提交标记为"提交D为" private-0001,"提交ABCD为" public-0001,"提交H为" private-0002和"提交EFGH为" public-0002.这至少可以让你记录下各个历史如何联系在一起.你永远不能将任何私有提交合并到公共分支中,因为提交会带来他们的祖先.
所以我建议找另一种方式.有几种选择,取决于您希望这些贡献保密的原因:
放弃你的计划,并让私人贡献者公开.
让私人贡献者以您的名义提交,或使用假名.(它们设置user.name并user.email在这个仓库的的.gitconfig.)如果你正在试图做的是让他们匿名所有,这将是足够的,无痛的.
半途而废.回顾第一个图,在你进行壁球合并之后,让所有私人贡献者重置到那一点(重新定位他们可能拥有的任何其他分支).每次公开发布时,你基本上都会抛弃私有提交,并将壁球合并提交视为新的真相.这需要你保持警惕,确保其他贡献者按照要求行事,但它会让你免除所有疯狂历史的包袱.(如果某人未能重置,则它是可修复的.假设他们在提交而不是提交E之前进行D了提交ABCD.他们可以用它git rebase --onto commit-ABCD commit-D来移植它所属的分支.)你的历史最终会像这样:
- W - X - ABCD ------------------ Y - Z - EFGH - ...
\ \
A - B - C - D (abandoned) E - F - G - H (abandoned)
Run Code Online (Sandbox Code Playgroud)
这样做的好处是,你从来没有任何可怕的粗糙合并跨越很多历史,你不会以无关的合并或重复提交的形式拖累任何行李.如果你不经常公开发表私人捐款,那就不会那么痛苦.如果你小心的话,甚至可以让事情变得有点异步,例如:
- W - X - AB - X - CD - Z - ...
|\
| A - B (abandoned)
\
C - D (abandoned)
Run Code Online (Sandbox Code Playgroud)
只是非常非常小心地跟踪你合并的东西.除了我之前讨论过的标记之外,你还可以让你的squash-merge提交包括一个简短的SHA1列表和来自合并提交的提交主题.