【问题标题】:Unequivocally checkout a branch and get latest version in git from a script明确地签出分支并从脚本中获取 git 的最新版本
【发布时间】:2020-12-02 14:25:15
【问题描述】:

我正在创建一个 shell 构建脚本。

我希望它被这样称呼:

./build.sh REPONAME BRANCHNAME

$REPONAME 对应一个遥控器。我假设遥控器存在。 $BRANCHNAME$REPONAME 上的一个分支。

$BRANCHNAME 可能从未在此计算机上签出。

所以我有这个:

cd $REPOPATH
git fetch $REPONAME $BRANCHNAME
git checkout --track $REMOTE/$BRANCHNAME
git pull $REPONAME
echo `git rev-parse HEAD`

这种工作,但我遇到了几个问题:

  • 我必须输入我的密钥的私钥两次 - 我猜一次用于获取,一次用于提取。不重要,但如果只做一次就更好了。
  • 因为--track,如果$BRANCHNAME过去已经签出,我得到

致命:一个名为 $BRANCHNAME 的分支已经存在

。不知道这到底有多致命,但我不喜欢在输出中看到致命的情况

  • 没有--track,我会进入分离模式,我也不喜欢这种模式
  • 只有git checkout $BRANCHNAME 我突然收到关于“模棱两可”分支的消息。可能是因为$BRANCHNAME 可能在多个遥控器上?

那么,从远程签出分支、获取其最新版本并从中构建的最干净、最明确的方法是什么?f

令人惊讶的是,在使用 git 这么多年之后,我仍然没有掌握必须知道的技能。

【问题讨论】:

    标签: git git-branch git-checkout git-repo


    【解决方案1】:

    如果你想放弃一切并获得远程版本:

    git fetch $REMOTE
    git stash
    git checkout $BRANCHNAME
    git branch -u $REMOTE/$BRANCHNAME
    git reset --hard $REMOTE/$BRANCHNAME
    

    如果您想在本地分支中合并来自远程分支的更新:

    git fetch $REMOTE
    git stash
    git checkout $BRANCHNAME
    git branch -u $REMOTE/$BRANCHNAME
    git merge $REMOTE/$BRANCHNAME
    

    【讨论】:

    • 这看起来很有希望。谢谢。
    • 我通常不会对该分支进行任何更改,因此第一个建议看起来最合适。
    • 我的第一个答案中的某些操作可能会失败(例如,如果$BRANCHNAME 是您的活动分支git branch -f $BRANCHNAME ... 将失败)。编辑了我的答案,可能会打印一些警告,例如Already on '$BRANCHNAME',但应该可以。
    • 我会接受这个,因为这接近我的要求。我目前在问自己,我是否应该每次都更好地克隆 repo。可以为我的用例工作。但这不是问题:)
    猜你喜欢
    • 1970-01-01
    • 2015-01-06
    • 2012-01-02
    • 2013-03-20
    • 2021-08-17
    • 2015-04-17
    • 2021-07-22
    • 1970-01-01
    • 2018-07-03
    相关资源
    最近更新 更多