2016-05-04 15 views
0

新しい機能ブランチを作成し、そこにファイルを追加しました。そのブランチを作成した後のすべてのコミットは、このファイルのみを対象とします。
今、私はこれらのコミットを、この新しいファイル用の新しいリポジトリに移動したいと思います。
どのように達成できますか?古いリポジトリをリモートリポジトリとして新しいリポジトリに追加しようとしましたが、すべてのコミットをチェリーピックアップしましたが、機能ブランチの前や他のファイルから古いコミットメッセージを取得して、元のコミット日付を失います。git:別のリポジトリへのコミットのコピー/移動範囲

だから、これは私が必要なものである:

  • コピー/他は存在しない(別の
  • 今日にそのファイルを作成から始めて、そのファイルの唯一のコミットに1つのレポからコミットの範囲を移動間に関与したファイルが、古い機能ブランチを作成する前に)
  • は原作者を維持し、私も試したどのような日付

をコミット:

# git rebase --onto develop oldRepo/feature/issue#14 c7bc952 

ここで、c7bc952は現在のHEADです。

私が得たもの:このような

First, rewinding head to replay your work on top of it... 

# git status 
HEAD detached from 4ae31a1 
nothing to commit, working directory clean 
+0

ここのような感じです:http://stackoverflow.com/questions/7375528/how-to-extract-one-file-with-commit-history-from-a-git-repo-with-index-filter – kan

+0

うーん... UNIXシェルのように見えるが、私はWindowsだ。 –

+0

"git bash"シェルは通常Windows distで利用可能です – kan

答えて

2

大手術が最良の直接新しい歴史を構築することにより行われます。私はスクラッチクローン中、このような作業をしたい:あなたの場合は

git filter-branch --index-filter ' 
         git read-tree --empty 
         git reset $GIT_COMMIT -- that/file 
       ' \ 
     -- --all -- that/file 

:のみ含まれるように歴史のすべてを書き換えるために今

git clone -s . $TMPDIR/wip   # scratch clone 
cd !$ 

すると、そのファイルに影響を与え、そしてそれらのコミットからのみ、そのファイルのコミット1つのブランチが必要です。上記の--allの代わりにmaster

これで、書き換えられたブランチを任意の場所にプッシュできます。このレポの「起源」は、あなたが複製したレポです。簡単にまとめとして


:オブジェクトDB、レフリー、インデックス、worktree:

  • 作業リポジトリは四つの部分に入っています。 HEAD refは、通常、現在のインデックスおよびワークツリーを生成したコミットを識別します。 git commitは新しいコミットの最初の親としてそれを使用し、git checkoutはそれを新しいブランチに切り替えます。

  • インデックスは単なるリストにすぎません。パス名、コンテンツID、飛行操作に関するメタデータです。例えば、Gitのステータスは、HEADの照合でパスにコミットされたもの、最後に追加またはチェックアウトされたものを確認するためのインデックス、unstaged aka unadded aka notracked aka unindexed contentを検索します。

  • refはオブジェクトdbの親指です。(あなたがworktree、それを聞いている場合、および)

ので、git read-treeは、オブジェクトDBからインデックスをロードするものです。これは、gitで行うことの大部分を担う基本的な操作です。


にフィルタ分岐では、REV-リストがあなたの引数から生成すべて(最初--後のもの)に供給し、フィルタを呼び出します。ここでは--all -- that/fileを提供しているので、rev-listはコミットするすべてのコミットをthat/fileに提供します。インデックスフィルタを指定すると、filter-branchはコミットからインデックスをロードし、GIT_COMMITに設定し、フィルタを実行し、結果のインデックス状態を使用してコミットを書き換えます。

ここで、git read-tree --empty; git reset $GIT_COMMIT -- that/fileはインデックスを空にして、現在のコミットからthat/fileエントリのみを読み込みます。泡立ち、すすぎ、繰り返します。

+0

うまく動作します。私はそれがどのように動作するのか大まかに考えていますが、これがどのように機能するのか説明はありますか?私はfilter-branchとread-treeのドキュメントを読もうとしましたが、現時点ではこれは私にとっては高すぎます。しかし、私は学びたい! –

0

これは私が最初に見つかったソリューションですので、私は私の質問に答え、多分それは他人のために有用である:

git rebase hash_of_parent_of_first-commit hash_of_last_commit --onto develop --committer-date-is-author-date 

これは、開発、空のブランチの前に私に私の現在の機能ブランチからすべてのコミットをリベース。

関連する問題