目前,如果我在 git 中向对象添加注释,我必须明确地将此信息推送/拉取到远程服务器。
是否可以配置 git,以便在我执行git push
时它会推送我的本地笔记更改以及任何本地源更改?
同样适用于 git 拉取。
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 通常对标签之类的东西所做的。当您运行git push origin --tags
时,它基本上会扩展到git push origin refs/tags/*
.
git push
默认情况下不会推送所有标签(请参阅"为什么 git 默认不推送标签?
出于同样的原因,git push
不会推送所有笔记。
您可以自动推送笔记,但它会更改默认推送
是的,您可以将远程配置为推送多个分支和其他分支。
它的代价是覆盖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}
。您可以
git push origin "@{upstream}"
你会收到这样的投诉
fatal: remote part of refspec is not a valid name in @{upstream}
因为 git 将其解析为 refspec @{upstream}:@{upstream}
,不会@{upstream}
解析为远程端的任何内容,并抱怨。这与它在推送HEAD
时的行为不同,在推送时,它会自动使用分支名称作为上游。
不幸。但你可能会争辩说@{upstream}
在远程方面没有意义。
愿望清单:简单加上额外的参考规格
我们真正希望能够做的是添加额外的 refspec,而不管push.default
行为。
但是 git 无法理解remote.*.push
设置中的push.default
名称 - 毕竟它无法将它们与分支名称区分开来。
它似乎也没有办法说"使用此remotes.origin.push config添加到默认的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
(始终推送主(或(危险(refs/heads/*
而且似乎没有办法将"推送到配置的上游源,如果没有就拒绝"的"简单"行为编码到refspec的远程端。
测试
我强烈建议您先
git push --verbose --dry-run --porcelain origin
在你做任何事情之前。该--porcelain
禁用了摘要的"有用"习惯,即简化refs/heads
,以便在配置中出错时使它们变得模棱两可。
另外,请注意,您将禁用 git 的默认保护,以防止意外推送与同名上游不对应的分支。
总的来说,我建议不要这样做。
参见
- https://git-scm.com/docs/git-push 中的"--refspec"
- https://git-scm.com/book/en/v2/Git-Internals-The-Refspec
- https://git-scm.com/docs/gitrevisions
- https://git.seveas.net/the-meaning-of-refs-and-refspecs.html
- https://www.atlassian.com/git/tutorials/refs-and-the-reflog