2016-11-24 84 views
7

我有以下分支在远程原点。git指定前缀提取分支

ft_d_feature_abc 
ft_d_feature_xyz 
ft_d_feature_lam 
ft_d_feature_ton 
ft_m_feature_mak 
ft_m_feature_echo 
ft_m_feature_laa 
ft_m_feature_pol 

我想获取以ft_d开头的分支。我怎样才能达到这个git fetch? 我的Git版本是1.7.9.5。

回答

5

由于Git版本2.6,您可以指定部分子(带简单的glob风格的匹配)在一个fetch或push refspec中。因此:

git fetch origin 'refs/heads/ft_d*:refs/remotes/origin/ft_d*' 

会做你所要求的。广义正则表达式是而不是可用,也不是普遍化的格式:只允许匹配两个固定字符串之间的所有内容的一个特定格式*。 (这里有些固定字符串可能是空的。通常情况下,后面一半,也就是我们通常取refs/heads/*,不refs/heads/*x得到的只是他的名字在x结束分支。)

如果你的Git是比2.6年纪大了,也没有简单的方法来完成一个抓取。您需要循环获取多个提取,并且您需要进行自己的名称匹配,也许使用git ls-remote的输出。

(当然,git fetch origin通常只是把一切结束了,作为remote.origin.fetch配置一个或多个条目指定的,在大多数情况下,在制约git fetch这样的小点。您确定要这么做呢?)

+0

我的Git版本是1.7.9.5。我要更新我的git并会检查这个。 – dnsh

+0

这工作。由于我是git新手,我无法完全理解这一点。我不得不阅读https://git-scm.com/book/en/v2/Git-Internals-The-Refspec来理解这个解决方案。 – dnsh

0

我不知道的Git支持获取一个分支正则表达式,但是,你可以创建一个简单的脚本,它会为你:

for i in {1..3}; 
do 
    git fetch origin ft_d_feature$i 
done 
+0

为简单起见,我写了feature1,2,3。我的分支名称中没有序列。我更新了我的问题。 – dnsh

0

另一种方式是列表中的远程分支:

PREFIX='ft_d_feature_' 

for BRANCH in $(git branch | cut -c 3-); do 
    if [[ $BRANCH = $PREFIX* ]] ; then 
     echo $BRANCH; 
    fi 
done 

编辑

实际调用git fetch每个分支:

PREFIX='ft_d_feature_' 

for BRANCH in $(git branch | cut -c 3-); do 
    if [[ $BRANCH = $PREFIX* ]] ; then 
     git fetch origin $BRANCH 
    fi 
done 

EDIT2

另一种方法是创建一个git的别名,你可以在你~/.gitconfig文件中添加它。

[alias] 
    fetch-prefix = "!f(){ for BRANCH in $(git branch | cut -c 3-); do case $BRANCH in $1*) git fetch origin $BRANCH; esac; done; }; f" 

用法: git fetch-prefix ft_d_feature_