当我进行 git push/git 拉取时,是否可以让 git 自动更新远程服务器上的笔记



目前,如果我在 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

相关内容

  • 没有找到相关文章

最新更新