2016-06-28 51 views
0

有没有办法在git中创建只有提交影响目录的分支?从目录下提交的“提取”分支

例如,给出如下内容(提交,提交的补丁,分支)回购:

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

创建一个分支,它看起来像:

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

到目前为止,我已经想到了做这样的事情:

git log --right-only --cherry-pick master...develop -- dir1 

我想这会返回提交,我需要在新的分支,但我不知道如何用这些提交“提取”分支。

回答

1

在你的分支上做一个git过滤器分支。详细信息请参见https://git-scm.com/docs/git-filter-branch。查看--subdirectory-filter标志。我只是重读你的问题陈述,看起来你想过滤多个目录,而不是一个?如果是这样,它看起来像--subdirectory过滤器不能使用,因为你只能指定一个目录(它看起来不像你可以指定--subdirectory过滤多次,每个不同的目录一次) 。

也期待在https://github.com/slobobaby/git_filter

+0

看起来他只是想'dir1'(他的分支在给出的例子中'master'开始),所以我认为--subdirectory-filter会起作用。 – bobDevil

0

也许修补是更适合您的需求。

创建补丁使用下面的命令:

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

然后,让你的分支无论你打算,希望从提交这是一个共同的祖先,并应用补丁。 这里是diffapplying一个补丁的官方文档。通过这种方式,如果有冲突,您可以轻松解决它们。

0

git subtree split是你需要的。

由于Git的某些版本马上可用;在旧版本中,它是Git分发版的“contrib”目录中的脚本。

0

如果您选择提交他们所做的更改,那么您需要rebase或cherrypick。为此,它看起来像樱桃木将是最容易的。

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

是简单的方法来做到这一点,就不会注意到它可能只是快进了你的提交c但这是否真的重要吗?如果是这样,只需将c的ID替换为master即可,但请记得在返回其他目录时再取消它。