在git中,只有在分支不存在的情况下,我们如何在创建分支时签出它?
因此,在git中,只有在分支不存在的情况下,我们如何在创建分支时签出它?,git,Git,因此,git checkout-B不适合这个账单,因为它会强制当前磁头,即使磁头已经存在并指向其他地方 我想要一种不同的行为。如果分支存在-签出,如果不存在-在当前标头处创建,然后签出 我当前的解决方案(在Powershell中)是: 有较短的路吗 编辑1 我一直在思考我定义问题的方式,这些评论帮助我认识到我需要消除一些歧义。因此: 在git fetch--force--tags--prune origin 如果存在远程跟踪分支,则应签出此分支 应忽略没有相应远程端口的本地分支 如果本地和远程跟
git checkout-B
不适合这个账单,因为它会强制当前磁头,即使磁头已经存在并指向其他地方
我想要一种不同的行为。如果分支存在-签出,如果不存在-在当前标头处创建,然后签出
我当前的解决方案(在Powershell中)是:
有较短的路吗
编辑1
我一直在思考我定义问题的方式,这些评论帮助我认识到我需要消除一些歧义。因此:
git fetch--force--tags--prune origin
现在我可以看出我的方法是错误的,因为它不符合这些要点。感谢所有在这些方面指出的评论。为了避免使用
git签出
(或新的git开关
),请使用DWIM模式从$remote/$b
创建分支$b
(对于任何可能发生这种情况的$b和$remote),使用--NoGuess
标志。这个标志在Git2.21中是新的。(git-switch
本身在git 2.23中是新的,所以如果你有git-switch
,你就有了——没有猜测
)
您仍然需要至少两个命令才能获得所需的内容,但不再需要明确验证refs/heads/$b
是否首先存在
如果您的Git早于2.21,请执行显式验证:
git rev-parse --quiet --verify refs/heads/$branchname
如果失败(退出代码1),$branchname
不是现有的分支名称。如果成功(退出代码0),$branchname
是现有的分支名称。从那里开始
请注意,您的PowerShell片段表明您需要与文本中描述的行为不同的行为。您不关心是否存在某个本地分支,而是关心是否存在某个特定的远程跟踪名称。也可以使用git rev parse
方法;只需将refs/heads/$b
替换为refs/remotes/$o/$b
,其中$o
和$b
设置适当
重新编辑: 在git fetch--force--tags--prune origin之后检查存储库 嗯。请注意,这将使用现有的
remote.origin.fetch
refspecs(这可能很好)
如果存在远程跟踪分支,则应签出此分支
这是针对某个固定的分支名称,还是一组分支名称?(不确定如何在PowerShell中编写循环;对于name1 name2 name3中的分支,它将是;在sh/bash中是do…;done
)或者,是否要枚举所有远程跟踪名称和/或所有本地分支名称?(git for each ref
是通用的git名称枚举工具。)
应忽略没有相应远程端口的本地分支
如果您正在枚举refs/remotes/origin/
(所有origin/*
远程跟踪名称)中的所有名称,则会发生“免费”情况;如果要枚举一组固定名称,或者枚举本地分支名称,当然需要进行某种测试
请注意,在Git存储库中(尽管在CI系统存储库中更为罕见),具有(本地)分支名称和一些上游集合是一种传统。要查找某些本地分支的上游,请将git rev parse
与{upstream}
或{u}
后缀一起使用:git rev parse dev{u}
将测试dev
是否有上游集,如果没有,则会出错。如果它确实有一个上游集合,revparse将继续像往常一样处理它,根据标志将上游名称转换为哈希ID或符号名称
这种(拥有一个单一上游)的一般想法在三角工作流中不起作用,在三角工作流中,我们喜欢从存储库R获取新提交,但将新提交提交到不同的存储库S。如果它不适合你自己的任务,不要使用它
如果本地和远程跟踪分支都存在,则必须在远程跟踪处签出本地分支-必须重新对齐
这就是-B
操作
因此,假设一组固定的名称,它的sh/bash变体将是:
fatal(){
…在此处插入代码以打印错误消息并中止。。。
}
对于$list\u中的名称,请选择\u名称;做
#确定origin/$name是否存在。如果
#不,跳过这个名字。当我们在做的时候,保存
#哈希ID,因为我们马上就需要它。
hash=$(git rev parse--quiet--verify refs/remotes/origin/$name)|继续
#远程跟踪名称已存在。作为一个本地人呢
#分行名称?如果不是,则对$hash执行分离签出,但是
#如果是这样,请强制将本地名称重置为$hash。
如果git rev parse--quiet--verify refs/heads/$name>/dev/null;然后
#强制重置:
git开关-B$name$hash||
致命“无法将$name本地重置为$hash”
其他的
#分离式头部检查:
git开关--分离$hash||
致命“无法将头分离到$hash”
fi
... 对签出的文件执行一些操作。。。
完成
整个过程似乎有点可疑:如果我们需要对由特定名称决定的特定提交执行某些操作,我们可以对每个这样的名称执行分离头签出,只要我们不需要进行新的提交。而且,如果我们确实需要进行新的提交,我们可能永远不会想要任何分离的头签出,除非我们要尝试构建(
git rev-parse --quiet --verify refs/heads/$branchname