Git can";“远程分支”&引用;“远程跟踪分支”;及;跟踪分支机构“;你有不同的名字吗?

Git can";“远程分支”&引用;“远程跟踪分支”;及;跟踪分支机构“;你有不同的名字吗?,git,git-branch,refspec,git-refspec,Git,Git Branch,Refspec,Git Refspec,我在玩git 当前状态: 1) 我所在地的回购协议有一家分行 2) 远程回购有一个分支master_remote。(远程服务器的名称为hehe_服务器) 3) 我的本地.git/config看起来像 [core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true ignorecase = true precomposeunicode =

我在玩git


当前状态:

1) 我所在地的回购协议有一家分行

2) 远程回购有一个分支master_remote。(远程服务器的名称为hehe_服务器)

3) 我的本地
.git/config
看起来像

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
    precomposeunicode = true
[remote "hehe_server"]
    url = /path/to/git/remote_main.git
    fetch = +refs/heads/*:refs/remotes/hehe_server/*
[branch "master_local"]
    remote = hehe_server
    merge = refs/heads/master_remote
4) 当我运行
git fetch
时,git将获取
master_remote@hehe_server
to
hehe\u服务器/主机_remote@local(又名,/.git/refs/remotes/hehe_server/master)_remote@local)

5) 当我运行
git branch-vv
时,它会说

* master_local 06022cf [hehe_server/master_remote] my_commit_msg
6) 我明白

一,<代码>主控_local@local称为“跟踪分支”

二,<代码>主控_remote@hehe_server称为“远程分支”

iii.
hehe_服务器/主机_remote@local
被称为“远程跟踪分支”

7) 我的git版本是git版本2.23.0

8) 我正在使用Mac 10.15.1


我的问题:

我想重命名
hehe_服务器/主机_remote@local
to
hehe\u服务器/主机_haha@local
,同时保持其他一切不变。我可以这样做吗


我的实验:

我试着在
.git/config
中使用
fetch=
行,但它确实让人困惑

测试1

fetch=+refs/heads/*:refs/remotes/hehe_server/*
更改为
fetch=+refs/heads/master_local:refs/remotes/hehe_server/master_remote

结果1

git branch-vv说

*主机本地06022cf我的提交消息

似乎本地主机不再跟踪远程主机。。我不明白

测试2

fetch=+refs/heads/*:refs/remotes/hehe_server/*
更改为
fetch=+refs/heads/master_local:refs/remotes/hehe_server/master_haha

结果2


与结果1相同,Git在这里的术语是。。。不太好。特别是,术语“远程分支”和“跟踪分支”根本没有定义。有关定义的信息,请参见

然而,人们有时会使用短语remotebranch来表示远程跟踪分支名称或远程上检查分支名称的结果。人们和Git书籍有时使用短语tracking branch来表示具有上游集的分支

您对远程跟踪分支的定义与Gitglossary中的定义相匹配。我不喜欢这个词,因为它会导致人们放弃形容词tracking并称之为remotebranch,不同的人对它的理解不同。(我更愿意称之为远程跟踪名称,尽管这并不是一个真正的改进。主要的改进(如果有)在于不再使用“分支”一词。:-)

一个更一般的术语是ref(ref,它是reference的缩写,大多数时候我倾向于用很长的方式来解释)。如果您查看Git术语表,您会发现这个术语表的定义如下:

refs/
开头的名称(例如
refs/heads/master
),指向一个对象名称或另一个ref(后者称为符号ref)。为了方便起见,当用作Git命令的参数时,ref有时可以缩写;有关详细信息,请参见[7]。引用存储在存储库中

在任何情况下:是的,您可以按照您的建议对名称进行任意修改。
.git/config
中的
fetch=
行确定如何修改每个引用

运行
git fetch
时,过程的第一步是git调用其他git。Git访问该Git的URL来自:

  • 如果运行
    git-fetch,则使用命令行https://github.com/owner/repo.git
    例如,或
  • 存储在远程服务器名称下的URL,在本例中是存储在
    hehe_服务器
    下的URL,因为您使用了
    git fetch hehe_服务器
(还有其他几种指定存储库URL的方法,因为在发明远程设备之前有很多历史。这是两种常见的方法。)

建立此连接后,另一个Git会溢出其所有引用。1您可以使用
Git ls remote
亲自观察这一点:

git ls-remote hehe_server
此命令的输出是一组引用和散列ID,当Git显示它们时,Git会看到这些引用和散列ID

在任何情况下,Git现在都可以获取这些引用,并按照
fetch=
设置的指示对它们进行操作。每个设置由一个参照等级库组成。参考规范如中所述,但主要包括:

  • 可选的前导字符
    +
    表示强制
  • 源名称或模式
  • 冒号字符
    ;及
  • 目的地名称或模式
源名称或模式与其他Git提供的名称匹配。生成的目标名称或模式用于构造Git将创建或更新的名称(或者,使用
--prune
,如果没有与之匹配的输入名称,则删除)

这里有一些奇怪的限制。特别是,如果您设置了多个与单个目标匹配的源名称,或者设置了一个与多个目标匹配的源名称,则无法使用。例如:

+refs/heads/master:refs/remotes/hehe_server/foo
+refs/heads/master:refs/remotes/hehe_server/bar
使一个源,
master
,映射到两个输出,并且:

[remote "hehe_server"]
    fetch = +refs/heads/master:refs/remotes/hehe_server/foo
    fetch = +refs/heads/develop:refs/remotes/hehe_server/foo
使两个源,
master
develope
映射到单个输出。两者都不能有效地处理

我想重命名
hehe_服务器/主机_remote@local
to
hehe\u服务器/主机_haha@local
,同时保持其他一切不变。我可以这样做吗

有点像是,但大部分是否定的。特别是,如果你想把他们的
refs/heads/master
称为
refs/remotes/hehe_server/master_haha
,这部分很简单:

fetch = +refs/heads/master:refs/remotes/hehe_server/master_haha
这就是诀窍。但是如果你现在想带走所有的剩余
fetch = +refs/heads/*:refs/remotes/origin/*
#!/bin/bash
echo "
change branches' names
    refs/heads/master_local 
    refs/remote/hehe_server/master_haha
    master_remote@remote
"
PATHA=/path/to/an/empty/folder/


# Any subsequent(*) commands which fail will cause the shell script to exit immediately
set -e

# Makes the bash script to print out every command before it is executed except echo
trap '[[ $BASH_COMMAND != echo* ]] && echo "++++++RUN COMMAND: Line ${LINENO}: $BASH_COMMAND --- RESULT IS A BELOW"' DEBUG




cd $PATHA



echo "make a bare repo"
git --git-dir=$PATHA/remote_main.git init --bare


echo "clone"
cd $PATHA
git clone $PATHA/remote_main.git main --origin hehe_server


echo "------------------------------------------------------------------------------------------------------------------------------------"
echo "commit and push in master"
cd $PATHA/main
echo "test@master" > $PATHA/main/index.js
git add .
git commit -m "commit and push in master"
git push


echo "------------------------------------------------------------------------------------------------------------------------------------"
echo "commit and push in feature"
git checkout -b feature
echo "test@feature" > $PATHA/main/index.js
git add .
git commit -m "commit and push in feature"
git push -u hehe_server feature
git checkout master


echo "------------------------------------------------------------------------------------------------------------------------------------"
echo "commit and push in release"
git checkout -b release
echo "test@release" > $PATHA/main/index.js
git add .
git commit -m "commit and push in release"
git push -u hehe_server release
git checkout master



echo "------------------------------------------------------------------------------------------------------------------------------------"
echo "master@local --> master_local, master@hehe_server --> master_remote@hehe_server"

echo "# create and switch to the release branch"
git checkout -b master_local master

echo "# push the master_local branch to the remote and track it"
git push -u hehe_server master_local:master_remote

echo "# delete local master"
git branch -d master

echo "# delete remote master"
git --git-dir=$PATHA/remote_main.git symbolic-ref HEAD refs/heads/master_remote
git push --delete hehe_server master



echo "------------------------------------------------------------------------------------------------------------------------------------"
echo "hehe_server/master_remote@local --> hehe_server/master_haha@local"

echo "remove fetch= section first"
git config --unset remote.hehe_server.fetch
cat .git/config
echo "add first line for fetch="
git config --add remote.hehe_server.fetch "+refs/heads/master_remote:refs/remotes/hehe_server/master_haha"
echo "add second line for fetch="
git config --add remote.hehe_server.fetch "+refs/heads/*:refs/remotes/hehe_server/*"
cat .git/config


echo "check"
echo "see torek's warning: But if you now want to take all the remaining names and handle them in the usual way ...."
git branch -vv  # outputs: * master_local 0870a94 [hehe_server/master_haha: gone] xxx
git fetch
git branch -vv  # outputs: * master_local 0870a94 [hehe_server/master_haha] xxx


echo "why doesn't `git fetch --prune` remove the hehe_server/master_remote@local?"
ls -lah $PATHA/main/.git/refs/remotes/hehe_server
git fetch --prune
ls -lah $PATHA/main/.git/refs/remotes/hehe_server