5

目前,如果我向 git 中的对象添加注释,我必须明确地将这些信息推送/拉取到远程服务器。

是否可以配置 git 以便当我执行时git push它会推送我的本地注释更改以及任何本地源更改?

同样对于 git pull。

4

2 回答 2

4

是的git pull,不是git push

您可以获取笔记:

[remote "origin"]
    fetch = +refs/notes/*:refs/notes/*
    fetch = +refs/heads/*:refs/remotes/origin/*

但是,正如“自我注意”(2010 年,但我认为这没有改变)中提到的:

但是,您可以将 ' refs/' 下的任何内容推送到服务器,您只需要更明确地说明它。如果您运行它,它将正常工作:

$ git push origin refs/notes/bugzilla

实际上,您可能只想制作git push origin refs/notes/*将推送所有笔记的内容。
这就是Git 通常为 tags 之类的东西所做的事情。当您运行时git push origin --tags,它基本上扩展为git push origin refs/tags/*.

git push默认情况下不会推送所有标签(请参阅“为什么 git 默认不推送标签? ”)。
git push出于同样的原因,不会推送所有笔记。

于 2013-06-04T16:30:44.090 回答
3

您可以自动推送笔记,但它会更改默认推送

是的,您可以配置远程推送多个分支和其他分支。

它的代价是覆盖由 定义的默认“推送当前分支”行为push.default = 'simple',使其行为类似current;它推送到与上游同名的分支并忽略任何git branch --set-upstream-to已配置的分支。

假设您的遥控器是origin

git config --unset-all remote.origin.push
git config --add remote.origin.push "HEAD"
git config --add remote.origin.push "refs/notes/commits:refs/notes/commits"

推送注释并将分支推送到上游跟踪分支

我们应该能够实现类似push.default = upstream的行为:

# THIS WON'T WORK
git config --unset-all remote.origin.push
git config --add remote.origin.push "HEAD:@{upstream}"
git config --add remote.origin.push "refs/notes/commits:refs/notes/commits"

反而。

但它不适用于我的 git 2.17.1,失败:

fatal: Invalid refspec 'HEAD:@{upstream}'

即使我看到文档谈论@{upstream}在 push refspecs 中使用。你可以

git push origin "@{upstream}"

你会收到类似的投诉

fatal: remote part of refspec is not a valid name in @{upstream}

因为 git 将其解析为 refspec @{upstream}:@{upstream},没有解析@{upstream}为远程端的任何内容,并抱怨。HEAD这与它在自动使用分支名称作为上游的推送时的行为不同。

不幸的。但是你可能会争辩@{upstream}说在远程方面没有意义。

愿望清单:简单加上额外的参考规格

我们真正想要做的是添加额外的refspecs 并保持push.default行为不变。

但是 git 不理解设置中的push.default名称remote.*.push- 毕竟它无法将它们与分支名称区分开来。

它似乎也没有办法说“使用这个 remotes.origin.push 配置添加到默认的 refspec 列表”。

我想要这样的虚构非工作配置:

# THIS WON'T WORK
git config --add remote.origin.push "{DEFAULT}"
git config --add remote.origin.push "refs/notes/commits:refs/notes/commits"

或者

# THIS WON'T WORK
git config remote.origin.push_default "simple"
git config --add remote.origin.push "refs/notes/commits:refs/notes/commits"

或者

# THIS WON'T WORK
git config remote.origin.push @{simple}
git config --add remote.origin.push "refs/notes/commits:refs/notes/commits"

您必须使用明确的 refspec,例如refs/heads/master:refs/heads/master(always push master) 或 (DANGER)refs/heads/*

而且似乎没有办法将“推送到配置的上游源,如果没有就拒绝”的“简单”行为编码到 refspec 的远程端。

测试

非常强烈建议你先

git push --verbose --dry-run --porcelain origin

在你真正做任何事情之前。如果您在配置中犯了错误,则禁用摘要的“有用”习惯,即以使它们模棱两可的方式进行简化--porcelainrefs/heads

另外,请注意,您将禁用 git 的默认保护,以防止意外推送与同名上游不对应的分支。

总的来说,我建议不要这样做。

也可以看看

于 2018-10-26T07:01:13.500 回答