2012-01-06 19 views
1

私はいくつかの他の(私的な)共同作業者と一緒に作業してきたgithubプライベートリポジトリを持っています。 repo-aとしましょう。github:組織にプライベートレポを "リンク"

クライアントが自分の組織アカウントに私を追加しました。基本的に私のrepo-aをその組織の他の開発者と共有する必要があります。私はここに「分け前」が正しいかどうか分からない。多分私は "コピー"する必要がありますか?これをどうやって行うのですか?

私が誰かを助けることができるより重要な問題は、組織が私の私的な共同作業者のコミットメントを見ることを望まないということです。しかし、うまくいけば、のrepo-aの最新コードを組織に簡単に「プッシュ」することができます(私はまだrepo-a共同作業者と個人的に仕事をするつもりです)。これは合理的に可能ですか?

+0

リポジトリが表示されるように寄稿者として追加する必要はありませんか? – fge

+0

状況は彼らが私の組織に私を加えたことです(そしてまた私を管理者にしました)。私は必ずそれらを私の* repo-a *に持っていきたくはありません。代わりに、私は何とか* repo-a *の最新コードを組織に「プッシュ」する必要があります。 – moey

答えて

6

短い回答:いいえ、それは合理的に可能ではありません。

あなたはここで多くの問題を抱えています。あなたが与えた履歴に実際の履歴が含まれていない場合、定義上、バージョンに含まれるものの記録はありません。何があっても、 "非公開"のコミットが含まれていないブランチには、決してプッシュできません。あなたは基本的にはこのようになります歴史を持つように求めている:

- W - X - ABCD - Y - Z - EFGH - ... (public) 
     \    \ 
     A - B - C - D - x - E - F - G - H (private) 
ABCDは、B、C、およびDをコミットの変更を含むコミットされ、同様にEFGHがE、F、G離れて隠し

、これはgit checkout public-branch; git merge --squash private-branchを使用して行うことができます。スカッシュマージはマージを実行し、それを通常のコミット、すなわちマージされたブランチを親として記録することなく記録する。このオプションは、マージに非常に注意している限り、あなたのために働くかもしれません。しかし、それはまだ痛みです。 (YとZをマージすると、プライベートレポでABCDとABCDが重複してコミットされることに注意してください。これは醜いですが、これとは違って、完全に異なる歴史です)。

あなたの歴史は発散します。おそらく最良のケースは、タグを使って物事を追跡するのに役立つでしょう。たとえば、コミットDprivate-0001とタグ付けし、ABCDpublic-0001とコミットし、Hprivate-0002とコミットし、EFGHpublic-0002とコミットすることができます。それは、少なくとも、別々の歴史がどのように結びついているかの記録を残すことになります。 実際にプライベートなコミットをパブリック・ブランチにマージすることはできません。コミットはその先祖を持ってくるからです。

他の方法を見つけることをおすすめします。これらの寄付を非公開にしたい理由に応じて、いくつかの選択肢があります。

  • あなたの計画を放棄し、私的貢献者を公開します。

  • 私的貢献者にあなたの名前や偽名を使ってもらいましょう。 (彼らにuser.nameuser.emailをこのリポジトリの.gitconfigファイルに設定させてください)。匿名のままにしておくだけであれば、これで十分です。

  • 半分にしてください。最初の図を振り返ってみると、スカッシュ・マージを行った後、すべてのプライベート・コントリビュータがその時点にリセットされるようにします(他のブランチを再配置する)。公に公開するたびに、あなたは本質的に私的コミットを捨て、スカッシュ・マージコミットを新しい真実とみなします。これは、あなたが必要としていることを他の貢献者が確実に行うように、あなたの注意を払う必要があります。しかし、それはあなたの狂気の歴史の荷物を惜しまないでしょう。 (誰かがリセットに失敗した場合、それは修正可能である、彼らはDをコミットする代わりにABCDをコミットの上にEをコミット作ったと彼らはそれが属している彼らの枝を移植するgit rebase --onto commit-ABCD commit-Dを使用することができます。。。)あなたの歴史はこのように終わるでしょう:

    - W - X - ABCD ------------------ Y - Z - EFGH - ... 
        \        \ 
        A - B - C - D (abandoned)  E - F - G - H (abandoned) 
    

    これは、多くの歴史にひどくぎこちないマージがないこと、そして余分なマージやコミットの重複の形で手荷物の周りをドラッグすることがないことです。プライベート寄付を頻繁に公開することはあまりありませんが、痛いことさえありません。あなたも、たとえば、あなたが注意している場合、物事は少し非同期取得してみましょうことができます:

    - W - X - AB - X - CD - Z - ... 
         |\ 
         | A - B (abandoned) 
         \ 
         C - D (abandoned) 
    

    ちょうどあなたがスカッシュ、マージされてきたものを追跡することは非常に、非常に注意してください。先ほど説明したようにタグ付けする以外に、あなたのスカッシュ・マージ・コミットに短いSHA1のリストを組み込み、マージされたコミットからサブジェクトをコミットすることもできます。

+0

私(そしてこのコミュニティ)を助けてくれてありがとう。あなたの説明は非常に徹底的であり、それを書く時間を費やすこと(+1)は非常に寛大です。 – moey

+0

これが最良の回答となりました。最後に、私は自分の答えで説明された手順を使ってこの問題を解決しました。しかし、ここの2番目の提案もうまくいくかもしれません。 @jrm:Orgアカウントは* private *リポジトリをフォークできますか? – moey

0

私が誰かを助けることができるより重要な問題は、組織に私の私的な協力者がコミットした履歴を見せたくないということです。

Gitリポジトリには、すべての履歴が付属しています。毎回。そこから.git/フォルダを削除してから、git initを再度実行して、リポジトリの現在の状態を「書き出す」ことができます。これはあなたの履歴をリセットするようなものですが、現時点ではまったく別のリポジトリになります。

これを行うと、この新しいリポジトリをその組織アカウントのリポジトリにプッシュするだけで、基本的に古いリポジトリのスナップショットから開始することができます。

私はあなたの質問を正しく理解しました。

+0

入力いただきありがとうございます、@ジミー!しかし、私のプライベートレポの最新のコードを組織に「プッシュ」することはできません(つまり、2つのレポを完全に別々にすることができます)ので、これは長期的には機能しません。 – moey

+0

@ Siku-Siku。Comはそうではないかもしれません: 'git-rebase'マンページ、特に' --onto'オプションを見てください。 – fge

-1

私は、新しいレポレポ-Bと組織のアカウントと同期それを作成してしまいました。 repo-aからrepo-bの新しい変更を「組み込む」ために、rsyncコマンドを使用します。参考までに正確なコマンドについてはaccepted answerを参照してください。

それはOrgリポジトリを更新するとき、私の規律/フローに依存します。 repo-aに新しいコミットがあるたびに同期するか、またはいくつかのものがあるまで(本質的にスカッシュマージのように)待つことができます。このようにして、Orgアカウントは自分のコミットの履歴を見ることができます。

関連する問題