2012-07-02 8 views
5

2つのリポジトリ(元のプロジェクトとHISTORYなく変更プロジェクト)をマージ:githubの上でホストされている私は2つのリポジトリ持っ

  • Gephi(ビッグオープンソースプロジェクトを)gephiに基づいて私の会社の
  • プロジェクト

私たちのプロジェクトが始まったとき、誰かがgithubのgphiプロジェクトのスナップショットを取って企業のsvnに保存しました=>履歴の損失を減らす

私は私は今のgitリポジトリは、私のファイルのgit-svnの

でSVNから移行したgitリポジトリに我々のプロジェクトを移動し、元のプロジェクトで

を変更をマージすることは私たちのプロジェクトは

を開始した時間を超えて変更履歴を持っていませんリポジトリの初期状態を元のリポジトリの状態にマップできますか?言い換えれば、特定のリビジョンから元のリポジトリに変更を加えることを始めたいと思います。

更新:

今日は、私は別の障害物を発見しました。最初のスキーマ:

enter image description here

  • 赤色分岐が

  • <alpha1><alpha2>

  • における(<E' E'' E'''>にコミットコードに無関係)メインプロジェクトのためのプラグインのコミットされている元のプロジェクトであります<E'> <E''> <E'''>は、メインプロジェクト(赤色)リポジトリ<E>(各コミットc CA私は1つに赤と青のリポジトリをフェッチしている

<E>からプロジェクトの三分の一)。 2番目のスキーマでは、私は希望の状態です。これは可能ですか? (例えばひとつは(<E'>をコミット)し、次に枝<ABCD><alpha1 alpha2>からマージとしてコミットマーク<E' E'' E''>から作る)

ご回答のためにあなたのジュリアンありがとうございます。非常に役立つようです。

答えて

5

免責事項:私は今これをテストしており、期待どおりに動作しているようです(もちろん、あなたが正しくあなたを理解したと仮定して)。しかし、まだ間違っていることがたくさんあります。 絶対にプロジェクトのリポジトリの別の作業コピーでこれを試してみて、どこにでもプッシュする前にすべてを調べてください。これを行う前の状態の完全なディレクトリバックアップを保持します。

私はあなたが2つの独立したリポジトリを持っていると仮定します。元のプロジェクト(Gephi):

A---B---C---D---E 
       ^HEAD of Gephi 

そして、最初のリビジョン、元のプロジェクトの最後のリビジョンと同じに見えるプロジェクト、:

E'---V---W---Y---...---Z 
        ^HEAD of your project 

(おそらくいくつかの支店を持つが、それは本当に問題ではありません。 。ここで私が正しく理解している場合あなたは(したいのですがどのような)

)は次のとおりです。

A---B---C---D---E---V---W---Y---...---Z 

あなたは以下を試すことができます。 もう一度、これを独自の作業ツリーで行い、全てを中央のリポジトリにプッシュする前にすべてが正しいかどうか確認してください!

独自の作業ツリーのディレクトリに、元Gephiリポジトリの頭やオブジェクトをフェッチしながら:

git fetch /path/to/original/gephi 

あなたはGephiリポジトリをクローン化していない場合、あなたにもgithubのを指定するかもしれませんがローカルのファイルシステムのパスではなくURL。

これはあなたの現在の作業ツリーで、次のような状況になります:

A---B---C---D---E 
       ^FETCH_HEAD 

E'---V---W---Y---...---Z 
        ^HEAD 

私たちは多くのことを変更していません。現在、2つのヘッドは互いに平和的かつ完全に独立して共存していますが、両方のリポジトリのオブジェクトにアクセスできるようになり、それらを結合しようとすることができます。

我々は今、(それがEと同一である必要があります)、E「を破棄し、代わりに、Eにこれを行うにはV.あるプロジェクトの最初のコミットの親を、作りたい、あなたは使用することができgit filter-branch

git filter-branch -f --parent-filter 'test $GIT_COMMIT = <V> && echo "-p <E>" || cat' 

<V><E>をそれぞれVとEのコミットハッシュで置き換えます。それらを見つけるには、git logを実行してプロジェクトのコミットを調べてから、それを取得してからgit log FETCH_HEADにGephiのコミットを調べることができます。

これは実質的にそれが元Gephiリポジトリのヘッドは(すなわち、最新のコミット)、あなたは上のプロジェクトをベースとするものではないという意味ことが判明した場合、これでも動作するはずE.

に直接Vを接続しますあなたが(まだ?)世話していないGephiに新たなコミットがあったということです。ちょうど、<E>を、あなたの変更に基づいているコミットのハッシュで置き換えるには、ではなく、という頭を付けてください。

逆に、<V>を最初に変更したのハッシュに置き換えてください。リポジトリにEと同じEが含まれていない可能性がありますが、最初のコミットにはすでに元の変更が含まれています。その後、この最初のコミットハッシュはあなたの<V>になります。

A---B---C---D---E---F---G---H---I 
       ^   ^FETCH_HEAD 
       point where your project branched off 

V---W---Y---...---Z 
^    ^HEAD 
first change based on E 

ただ、この文脈では意味をなさないコミットハッシュを使用してください:あなたの状況は、例えば、これは、ように見える場合は、上記のコマンドでも動作するはずです:両方の最後の段落を要約する

+0

私はこれをテストしたところ、うまくいくと思われます(上に警告を更新しました)。私は今でも使い捨ての作業ツリーでこれを試して、完全なバックアップをとるようにアドバイスします。 'filter-branch'文を間違えたり、ハッシュを混ぜたりするのは簡単です! –

+0

ローカルプロジェクトに複数のブランチがある場合、または履歴にマージがある場合、 'git rebase'はヒストリを線形化するので適切なツールではありません。代わりに 'filter-branch'を使用してください。 –

+0

ありがとうございます。それは私が元々持っていたものだったが、私はrebaseがより簡単な構文を持っていると思った。私は変更を元に戻し、今度はfilter-branchを再度言及します。 –

1
それはあなたが grafts(または可能性 replacements)を調査する場合がありますように聞こえる

- これらのメソッドは、その中filter-branchrebase異なる彼らはむしろ歴史を書き換えるよりも、リポジトリの可視状態を変更するためにメタデータを追加するために、実際に効果変化。これは、既存のブランチを使用している人がいて、その下の履歴を変更しないようにする場合に便利です。

あなたのケースでは、にグラフトを追加し、余分な親としてEを付与したいと考えています。

+0

私は 'git replace'をグラフトにすることをお勧めします - 置き換えは参照なので、リポジトリ間で(適切なrefspecを使って)同期させることができます。 –

+0

はい、多くのケースでそうです。しかし、問題の説明は、ちょうど始めたgitリポジトリのように聞こえます(「今私はプロジェクトを移動することに決めました(私は今、gitリポジトリを持っています)」)、新しいリポジトリでは、それは時間の終わりまで残るでしょう。 –

関連する問題