别名远程分支localy

时间:2018-05-30 14:05:40

标签: git

我正在使用没有master分支但有几个vX.Y分支的repo。我总是在使用let {'}}作为我的远程分支。 我以前将远程分支称为master并且有很多别名来执行以下操作:

v1.2

我希望保持不变,因为这种情况发生了

我有没有办法将alias grhm="git reset --hard origin/master" 分支称为origin/v1.2? 这可以通过origin/master文件中的某些条目或类似的东西来实现,这样我就可以继续使用相同的shell环境处理其他repos吗?

1 个答案:

答案 0 :(得分:2)

TL; DR

你可以,但我认为这是不明智的。推动时你也必须小心。考虑重新调整您的习惯和/或在别名中使用@{upstream}或类似的东西。

有一种方法可以做你想要的,但它很笨拙且不灵活。您必须手动维护此特定存储库的.git/config文件,并在每次要重命名的分支名称集以任何方式更改时进行更新。

当您运行git fetch时(使用git fetch而不是git pull,我希望:-) ...如果您使用git pull,则此处会遇到更多问题),你的Git使用存储在远程名称下的URL - origin,在这种情况下 - 与其他一些Git联系。另一个Git有分支,通常名为masterdevelop等等,但有人对名称和/或幽默有着古怪的感觉,并使用v1.2代替。 (这更适合作为标记名称而不是分支名称。)

在任何情况下,您的git fetch都会从他们的 Git获取分支列表,并使用原始提交哈希ID来实现他们拥有的您没有的任何提交这个。提交带来了必要的任何文件。从技术上讲,Git只是传输对象,包括提交, blob 对象,以获取所有内容。在任何情况下,只要你有提交,你就拥有了你需要的一切,除了一部分:名称

您的git fetch现在继续重命名所有分支名称。此重命名由您的远程名称下的另一个设置控制:

$ cat .git/config
[snip]
[remote "origin"]
    url = <some url>
    fetch = +refs/heads/*:refs/remotes/origin/*

url设置包含我们已提及的网址。这个fetch行控制了分支名称重命名的方式,但是:这个特定的(标准)fetch设置告诉你的Git:匹配任何以refs/heads/开头的内容,并将其重写为以refs/remotes/origin/ 开头的字符串。第一个*是“匹配任何东西”部分,第二个告诉Git重新插入匹配的内容。

但您不希望将refs/heads/master更改为refs/remotes/origin/master,将refs/heads/v1.2更改为refs/remotes/origin/v1.2。具体而言,您希望将refs/heads/v1.2(如他们的Git上所见)更改为refs/remotes/origin/master(存储在您的Git存储库中)。幸运的是,你没有 使用*来匹配所有内容 - 你可以列出每个名字,一次一个:

[remote "origin"]
    url = <some url>
    fetch = +refs/heads/v1.2:refs/remotes/origin/master
    fetch = +refs/heads/mr_t:refs/remotes/origin/i_pity_the_fool

等等。这些 refspecs 中的每一个都以加号开头 - 这会设置“强制”标志,这样您的Git就会使用他们的覆盖您的引用 - 即使这不是快进操作,也会获取值 - 然后列出他们的分支名称,冒号将他们的名字与您的名字分开,然后列出您的名称,在refs/remotes/origin/名称空间中。由于您未使用*匹配,因此必须列出您要从中复制的每个分支,并在您身边提供唯一的名称。< / p>

请注意,这些提取引用指针对推送操作没有影响。如果您打算将某些内容从master推送到v1.2,则必须运行{{ 1}}。您只能为每个分支设置一个上游名称;您需要使用重命名的git push origin master:v1.2名称,当然 origin/master上的实际名称。将origin配置为push.default(就像在Git 2.0及更高版本中一样),如果您的分支名称与其分支名称不匹配 - 它不会 - 它必须拼出所有你的推送命令。