目前,如果我向 git 中的对象添加注释,我必须明确地将这些信息推送/拉取到远程服务器。
是否可以配置 git 以便当我执行时git push
它会推送我的本地注释更改以及任何本地源更改?
同样对于 git pull。
是的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
出于同样的原因,不会推送所有笔记。
是的,您可以配置远程推送多个分支和其他分支。
它的代价是覆盖由 定义的默认“推送当前分支”行为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
在你真正做任何事情之前。如果您在配置中犯了错误,则禁用摘要的“有用”习惯,即以使它们模棱两可的方式进行简化--porcelain
。refs/heads
另外,请注意,您将禁用 git 的默认保护,以防止意外推送与同名上游不对应的分支。
总的来说,我建议不要这样做。