2012-01-19 24 views
3

私はリポジトリBを持っていますが、その内容はA/src/Bのサブディレクトリに存在する必要があります。私はAとBの両方からのコミットの履歴を含む1つのリポジトリAにしたい。別のディレクトリレベルでgitリポジトリをマージする

ウェブ上の他のソリューションは、ツリーを独立したサブツリーにそのまま残すか、リポジトリの選択された部分をマージする方法を示しているようだ同じディレクトリ構造を有する。

だから、これを行う方法はありますか?

答えて

19

これはかなり簡単ですが、コマンドは必ずしも明らかではありません。後でBからの更なる更新を組み込む必要がある場合には、git-subtree(サブツリーのマージ戦略と混同しないでください)が役に立ちます。 1つのリポジトリで終わりたいと言っているので、gitサブモジュールを使うのは適切ではありません。

ここでこれを行うための古典的な方法は、いくつかの説明を、です:リポジトリAに

  1. 変更:

    cd A 
    
  2. (リポジトリBからmaster支店(または何でも)を取得し、一時的に)FETCH_HEADとして保存します。

    git fetch /home/whoever/dev/B master 
    
  3. FETCH_HEADからの変更を無視するが、コミットしないマージを行います。これは後でマージを行うことができるように、マージの親にはFETCH_HEADが含まれます。 (その親が.git/MERGE_HEADに格納されます。)

    git merge -s ours --no-commit FETCH_HEAD 
    
  4. サブディレクトリsrc/Bでのステージング領域にFETCH_HEADBのまだフェッチmasterブランチ)からツリーをお読みください。 -uも同様の作業コピーにその結果を反映させる意味:これは除いて、GitHub's help page on the subtree merge strategyで提案されたものと同様である

    git commit -m "Merge in the history of master from B into src/B" 
    

git read-tree --prefix=src/B/ -u FETCH_HEAD 
  • 最後に結果をコミット私はBのためのリモートを作成するのをスキップしました。この手順でもサブツリーのマージ戦略は実際には使用されていないことに注意してください。正しく理解すれば、それ以降の変更をBから取り込むためだけです。

  • +0

    これは私にははるかに明確です。 「われわれのもの」が何を意味しているのか理解できなかった...そして、私はフェッチが間違ったディレクトリにファイルを置くと思った。 ...ありがとう。 – fodon

    関連する問題