【发布时间】:2022-01-16 06:22:05
【问题描述】:
我的问题类似于this one.
我将本地分支推送到服务器,在该服务器上首次创建它,并将其设置为本地分支的上游,使用--upstream。我无法以编程方式从上游提取跟踪信息,而无需对本地 git 存储库进行不必要的更改。比如想知道上游的HEAD指向的commit hash。
以下是我创建远程分支并将其设置为上游的方式:
$ git push --set-upstream sshname:/user/project.git
我可以git pull、git push 等等。但是,我的.bashrc 中有一个脚本,它检查上游服务器上最新提交的哈希并将其与我当前分支的哈希进行比较。 (这用于使用颜色方案美化提示,帮助我快速查看我是否记得将 repo 推送到服务器,或者我是否处于分离状态等)。该脚本在大多数本地存储库上都可以正常工作,在那里它使用远程HEAD 散列
$ git rev-parse "$(git branch --show-current 2> /dev/null)"@{upstream}
> fatal: upstream branch 'refs/heads/master' not stored as a remote-tracking branch
如您所见,它声称远程分支没有作为远程跟踪分支在本地存储。
我在 StackExchange 上寻找有关如何解决此问题的各种建议,包括 How to create git Remote-Tracking Branch 和 learning Git: tracking vs. setting upstream (-u) for remotes?。没有什么帮助。许多建议都是错误的,人们将remotes、remote tracking branches 和upstream urls 混为一谈。
这是人们可能建议的各种命令的输出:
$ git remote -vv
> [no output]
$ git branch -vva
> * master <HASH> <COMMIT_MSG>
$ git fetch -a
> From sshname:/user/project
* branch master -> FETCH_HEAD
这是显示我正在寻找的信息的第一个。但它不是机器可解析的格式,也没有--porcelain。 这也是错误的。 真正的 URL 以.git 结尾。而且服务器确实需要这个.git 后缀;不容忽视。
$ git ls-remote
> From sshname:/user/project.git
<HASH> HEAD
<HASH> refs/heads/master
现在是正确的 URL,但同样不可机器解析。
我还可以运行“破坏性”操作(不适用于脚本),以便以类似的方式间接获取此信息:
$ git pull
> From sshname:/user/project
* branch master -> FETCH_HEAD
Already up to date.
又是错误的网址。
$ git push
> Pushing to sshname:/user/project.git
To gitea:/murdock/dupmaster.git
= [up to date] master -> master
Everything up-to-date
不用说,我几乎不能相信脚本的这种不一致的输出。我需要一个类似porcelain 的输出。
现在我找到的最接近的解决方案是:
$ git config -l
> ...
branch.master.remote=sshname:/user/project.git
branch.master.merge=refs/heads/master
表明我可以通过这种方式获取上游“URL”:
$ git config --get branch.master.remote
> sshname:/user/project.git
但是,我仍然无法探测远程跟踪信息。手动,我可以根据这个“URL”添加一个 git 远程,然后运行git fetch -a,这(可能)会解决我的问题。但这是一个改变git repo 的“破坏性”过程。我正在尝试编写一些不会对存储库进行不必要更改的脚本。
如何在不更改 git 存储库的情况下以可靠的方式以编程方式获取跟踪信息?
如果可能的话,我会满足于自动创建远程跟踪分支。但我不想创建遥控器(如何自动命名它们?等等)。
【问题讨论】:
标签: git