2017-04-05 9 views
0

それは私にはかなり新しいことです。私たちは、私たちのソースコードにアクセスすることを顧客に認めました。 bitbucket/Sourcetreeを使うと、私はフォークを使って特定の状態へのアクセスをコミットすることができます。実際の(まだ開発中のコード)へのアクセスを許可したくありません。私はマイルストーンだけを共有する予定です。フォークはこのように使用できますか? 特定のコミットだけを共有するための他のオプションはありますか? BR、 ダニエルGitフォークを使用する

+0

[この回答](https://stackoverflow.com/questions/19641108/split-git-repo-in-a-squashed-public-and-initial-private)は、あなたが何をしているのかもしれない。パブリックブランチを拡張するときに必ずマージとヌルマージバックを行う必要があります。 – jthill

答えて

0

私はあなたがやりたいと思うものをするために、最も簡単な方法は、このようになります:

  1. チェックアウトは、あなたが共有したいコミット。
  2. コピープロジェクトディレクトリ別名(.git隠しディレクトリを除く)。
  3. 新しいgitリポジトリ(github、bitbucket、またはどこでも)としてプロジェクトディレクトリをコピーしました。または、それを圧縮してクライアントに直接送信してください。

この方法では、クライアントにコードのスナップショットが表示されます。現在のコミットはなく、履歴もありません。

+0

こんにちは、ありがとう、私はあなたの提案を検討します。私は歴史のないようにこのソリューションの部分 – dba

0

リポジトリ内でコミットまたはブランチレベルのアクセス制御を提供する方法はないと思います。より限定されたレポを作成するのは合理的なアプローチですが、ニーズに応じて、セルジオ・チューレンセフの提案でスナップショットをコピーするためのいくつかの選択肢を提案する可能性があります。

これは、共有スナップショットを履歴に戻す内部的なデータが失われる可能性があるという欠点があります。将来新しいバージョンを提供する場合や、フォークからコードベースにパッチを戻すことができる場合は、この分離によって追加の作業が作成されます。ソリューションの

パートは、単に(歴史を持つ)あなたコミットとそのコミット(提供スナップショット)の間の関係を追跡されます。そしてその問題の一部は、ある種のタグ付け規約で解決できるだけのものです。しかし、それを超えて、変更を前後に移行したいと考えるなら、いくつかの手動による移行作業を避けるために設定を行うことができます。あなたが最初に共有し、フォークのためのブランチを作成したいコミット識別、

まず、あなたのレポで:

ですから、このような何かを試みることができます。あなたはとタグ付けコミットしている場合はコミットツー・共有することが、その後

git checkout commit-to-be-shared 
git checkout -b fork_master 

(あなたが考える場合それとも代わりに fork-masterの顧客の名前が、これはあなたが他の誰かのために再度行う可能性があります何か...です)

次に、手動で新しいリポジトリにコピーする代わりに、オリジナルの「シャロークローン」を作成します。 URLを使用する必要があります(ローカルパスではありません)。普段file://path/to/my/repoよう/path/to/my/repo使用の何かとしてレポを扱う場合はそう...

cd .. 
git clone --depth=1 -b fork-master http://my.server/origin-repo 

これは一つだけのコミットをコピーし、設定します...詳細はお使いのOSに依存するが、うまくいけば、あなたは私が何を意味するか見ますブランチfork-masterのみを取得するように取得します。 しかし、はコミットのIDを保持します。したがって、あなたの起源では、将来的にはより多くの変更をfork-masterにマージし、結果として得られるコミットを簡単に共有することができます。BUTさらに変更を加える場合は、意図しない履歴の暴露を避けるための注意事項について下記を参照してください。

次に、お客様の起源となるサーバー上に(原産地に沿って)空のレポを準備します。

git remote add fork-origin http://my.server/fork-origin-repo 
git push -u fork-origin master 

(あなたが後で多くを持っているかもしれないと思う場合は、再度リモートのための顧客固有の名前を使用することができます...)

:次に、新規作成した浅いレポで2番目のリモートとしてそれを設定します

あなたが許可したい場合は、あなたの開発者のどれもfork-masterを追加することができます。こうすることで、顧客からパッチをシームレスに受け取ることができます。

今後のヒントを誤って公開しないようにするための秘訣があります。将来、fork-masterにマージしてfork-originに渡すと、デフォルトでは新しくマージされたコミットの履歴が表示されます。見た目の単純な修正は、あなたの浅いリポジトリにあります:

git pull --depth=1 

ここでの問題は、gitが混乱する可能性があることです。 (簡単に説明すると、新しく取得されたマージは、第2の親には深さ1を持たせたいが、第1の親には深さ1を持たないことを意味する)、解決するのが難しくない:

git pull --depth=2 

これで、マージによって新しく統合された作業の履歴が1つ追加されたことがわかります。コミットには、fork-masterにマージする変更が含まれているので、おそらく大丈夫です。コミットメッセージ、タグ、またはあなたが必ずしも共有したくないものがあるかもしれません。その場合、マージの直前に、常にバッファ・コミットを作成することができます。 F1は元の共有スナップショットです

F1 -------- F2 <--(fork-master) 
    /  /
/   B 
/  /
X ---- X --- A --- X <--(master) 

Aは、あなたが共有することを決めた以上の変更、Bは「お客様の安全」は基本的にAを複製することをコミットしている、とF2が新しいマージであるが含まれています。そして、顧客が

F1 ---- F2 
    /
     B 

あなたはBを作成するためにgit commitを呼び出すとき--allow-emptyオプションを使用する必要があり見るであろう。

注このエンドツーエンドをテストする機会はありませんでした。もし何かの段階でエラーが出たら私に知らせてください。私はそれに応じて更新することができます。

+0

こんにちはマーク、この素晴らしい説明に感謝します。私の場合、顧客側のコミットはありません。サイトでプライベートバックアップとして使用できるソースのみが必要です。どのような方法でも意図される共通の作業はありません。実際に@SergioTulentsevの提案は、私が必要とするものです。履歴のないリポジトリ(特定のコミットを共有することはできません)です。私はちょうど私の側でより簡単なワークフローのためにこれのためにフォークを使いたかった。だから問題は、この方法で使用することができます、私は作業リポに影響を与えずにこのフォークされたレポ履歴をクリーンアップできますか? – dba

+0

hmm ... "@user"は動作していません...? – dba

+0

マイルストーンに到達する際に別々のフォークを共有し、過去の状態(フォーク)を更新しないことを計画しています – dba

関連する問題