Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 重新设置分支(包括其所有子级)的基址_Git_Version Control_Branch_Rebase_Git Rebase - Fatal编程技术网

Git 重新设置分支(包括其所有子级)的基址

Git 重新设置分支(包括其所有子级)的基址,git,version-control,branch,rebase,git-rebase,Git,Version Control,Branch,Rebase,Git Rebase,我有以下Git存储库拓扑: A-B-F (master) \ D (feature-a) \ / C (feature) \ E (feature-b) 通过对featurebranch重新设置基址,我希望能够对整个子树(包括子分支)重新设置基址: 然而,这是实际结果: C' (feature) / A-B-F (master) \ D (feature-a) \ / C \

我有以下Git存储库拓扑:

A-B-F (master)
   \   D (feature-a)
    \ /
     C (feature)
      \
       E (feature-b)
通过对
feature
branch重新设置基址,我希望能够对整个子树(包括子分支)重新设置基址:

然而,这是实际结果:

      C' (feature)
     /
A-B-F (master)
   \   D (feature-a)
    \ /
     C
      \
       E (feature-b)
我知道我可以通过执行以下命令轻松手动修复它:

$ git rebase --onto feature C feature-a
$ git rebase --onto feature C feature-b

但是,有没有一种方法可以自动重新设置分支(包括其所有子代/子代)的基础?

几年前,我写了一些东西来处理这类事情。(当然欢迎对改进提出意见,但不要评判太多——那是很久以前的事了!我甚至还不知道Perl!)

它适用于更静态的情况-您可以通过设置形式为
branch..autorebaseparent
的配置参数来配置它。它不会触及任何未设置配置参数的分支。如果这不是你想要的,你可能会不费吹灰之力就把它砍到你想要的地方。在过去的一两年里,我并没有太多地使用它,但当我使用它时,它似乎总是非常安全和稳定的,只要大规模自动重定基址是可能的

就是这样。通过将其保存到
路径中名为
git auto-rebase
的文件中来使用它。在您真正尝试之前,最好使用干运行(
-n
)选项。它可能比您真正想要的要详细一点,但它将向您展示它将尝试重新设置的基础,以及在哪些基础上。也许可以帮你减轻一些痛苦

#/bin/bash
CACHE_DIR=.git/auto-rebase
TODO=$CACHE\u DIR/TODO
TODO\u BACKUP=$CACHE\u DIR/TODO.BACKUP
已完成=$CACHE_DIR/已完成
原始分支=$CACHE\u DIR/原始分支
REF_NAMESPACE=refs/pre-auto-rebase
打印帮助(){
echo“用法:git自动重定基址[opts]”
回显“选项:”
echo“-n干运行”
echo“-c继续上一次自动重基”
echo”-中止上一次自动重设基础
echo“(保留完整的已完成的回扣)”
}
清除自动回复库(){
rm-rf$CACHE\u目录
如果[-n“$dry_run”];则
#试运行在这里不应该做任何事情。它不会创建引用,也不会创建引用
#除非“自动重基”为空,否则请运行。将此项保留在此处以捕获编程
#错误,以及将来可能出现的-f选项。
每个ref的git--format=“%(refname)”$ref\u名称空间|
读参考时;做
echo git更新参考-d$ref
完成
其他的
每个ref的git--format=“%(refname)”$ref\u名称空间|
读参考时;做
git更新参考-d$ref
完成
fi
}
#从branch.*.AutoreBase获取重新基础关系
获取配置关系(){
mkdir-p.git/auto-rebase
#我们不能简单地阅读父母的指示,盲目地跟随他们的指示
#指令;它们必须形成一个有向无环图(如git!),该图
#此外,没有具有两个汇的源(即,可能不存在分支
#基于其他两个)。
# 
#awk脚本检查循环和双亲,然后首先按
#层次结构的深度(到达顶层需要多少父级)
#这意味着,所有的重定基址都是一个给定的
#父对象发生在一行中-便于删除缓存的引用。
IFS=$'\n'
git config——获取regexp'branch\..+\.autorebaseparent'\
awk'{
儿童=1美元
子(“^branch[.]”,子级)
子(“[.]自动回退分离$”,“,子项)
如果(父[子]!=0){
“打印”错误:分支“子级”指定了多个父级
错误=1
出口1
}
父[子]=$2
}
结束{
如果(错误!=0)
退出错误
#检查循环
for(父对象中的子对象){
删除缓存
深度=0
缓存[子]=1
cur=儿童
while(父[cur]!=0){
深度++
cur=父项[cur]
如果(缓存[cur]!=0){
打印“错误:分支中的循环。“子”。检测到自动回退分离层次结构”
出口1
}否则{
缓存[cur]=1
}
}
深度[子]=深度“父[子]”子
}
n=一个端口(深度、子级)
对于(i=1;i/dev/null;然后
如果!git show ref-q--验证“refs/remotes/$parent”>/dev/null;那么
child=“${pair}”
echo“错误:指定的父分支$子分支的父分支不存在”
出口1
fi
fi
如果[-z“$continue”];则
如果git show ref-q——验证“$ref\u NAMESPACE/$parent”>/dev/null;然后
echo“错误:ref$ref_命名空间/$parent已存在”
echo“很可能是以前的git自动重基没有完成;如果您已经修复了所有问题”
echo“必要的回扣,您可以在删除后重试:”
回声
echo“git update ref-d$ref_NAMESPACE/$parent”
回声
出口1
fi
其他的
如果!git show ref-q--验证“$ref\u NAMESPACE/$parent”>/dev/null;然后
echo“错误:您请求继续上一次自动重设基础,但需要”
echo“缺少缓存的ref$ref_命名空间/$parent。”
echo“您可以尝试从$CACHE_DIR的内容手动继续”
echo“和refs/$REF_命名空间中的任何REF仍然存在,或中止上一个”
echo“自动重设基础与\”git auto-rebase-a \”
出口1
fi
fi
完成
}
#创建预参照,存储重定基父对象的原始位置
创建_pre_refs(){
本地父级上一个父级
对于“${pairs[@]}”中的pair,请执行以下操作
parent=“${pair%*}”
如果[“$prev_parent”!=“$parent”];则
如果[-n“$dry_run”];则
echo git update ref“$ref_NAMESPACE/$parent”“$paren”
$ git rebase --onto feature C feature-a
$ git rebase --onto feature C feature-b
git branch --format='%(refname:short)' --contains C | \
xargs -n 1 \
git rebase --committer-date-is-author-date --onto F C^
export GIT_COMMITTER_DATE=$( date -Iseconds )
git branch --format='%(refname)' --contains C | xargs -n 1 | git rebase -p --onto master C^
unset GIT_COMMITTER_DATE
# don't forget to unset this variable to avoid effect for the further work
A-B-F (master)
   \
    O   D (feature-a)
     \ /
      C (feature)
       \
        T-E (feature-b)
[alias]
    # rebases branch with its sub-branches (one level down)
    # useage: git move <upstream> <branch>
    move = "!mv() { git rebase $1 $2; git branch --format='%(refname:short)' --contains $2@{1} | xargs -n 1 git rebase --onto $2 $2@{1}; }; mv"
A-B-F (master)
     \
      O`   D` (feature-a)
       \ /
        C` (feature)
         \
          T`-E` (feature-b)
A-B--------------------F (master)
   \                    \
    O   D (feature-a)    O`
     \ /                  \
      C                    C` (feature)
       \
        T-E (feature-b)
feature-a
feature-b