2016-06-28 9 views
0

ディレクトリに影響を与えたコミットだけでブランチを作成する方法はありますか?例えばディレクトリの下に作成されたコミットからブランチを "抽出する"

、(のパッチ、ブランチをコミット、コミット)は、次のようなレポを与えられた:これまでのところ、私が考えてきた

f' dir1/file12 (feature dir1) 
c dir1/file11 
b dir3/file32 (master) 
a dir3/file31 

g dir3/file33 (develop) 
f dir1/file12 
e dir2/file22 
d dir2/file21 
c dir1/file11 
b dir3/file32 (master) 
a dir3/file31 

は次のようになりブランチを作成します。

これは私が新しいブランチに必要なコミットを返すと思いますが、私はそうではありませんこれらのコミットを使ってブランチを "抽出"する方法を知っている。

答えて

1

ブランチでgit filterブランチを実行します。詳細については、https://git-scm.com/docs/git-filter-branchを参照してください。 --subdirectory-filterフラグを見てください。私はあなたの問題のステートメントを読み返していただけで、複数のディレクトリをフィルタリングしたいのではないかと思われますか?そうであれば、--subdirectory-filterは1つのディレクトリしか指定できないので使用できません(--subdirectory-filterを複数のディレクトリにそれぞれ別々のディレクトリごとに指定できるようには見えません) 。

はまた、おそらく、パッチ適用https://github.com/slobobaby/git_filter

+0

彼はちょうど 'dir1'(与えられた例では彼の枝は 'master'で始まります)がほしいと思うので、サブディレクトリフィルタが動作すると思います。 – bobDevil

0

を見て、あなたのニーズに適しています。

次のコマンドでパッチを作成します。

git diff origin/master HEAD -- <pathToDirectory>/ > changes.patch 

その後、あなたのブランチを作るしかし、あなたがうまくいけば、共通の祖先であるコミットからに計画し、パッチを適用します。 diffapplyingの公式ドキュメントはこちらです。このようにして、競合が発生した場合は簡単に解決できます。

0

git subtree splitが必要です。

Gitの一部のバージョン以降、すぐに利用できます。古いバージョンではGitディストリビューションのcontribディレクトリにあるスクリプトでした。

0

変更のためにコミットを選択している場合は、rebaseまたはcherrypickが必要です。これは、cherrypickが最も簡単になるように見えます。

git checkout -b feature/dir1 master 
git cherry-pick $(git rev-list --reverse master..develop -- dir1) 

はそれを行うための簡単な方法で、それはあなたの上にちょうど早送りがcをコミットできることを気付くことはありませんが、それは本当に問題ありませんか?そうであれば、上記のmastercのIDを入れ替えてください。ただし、他のディレクトリに戻ったときに元に戻してください。

関連する問題