【问题标题】:Equivalent of updateInstead for git fetch -uupdateInstead 等价于 git fetch -u
【发布时间】:2017-11-02 17:29:41
【问题描述】:

与其他地方的 documenteddiscussed 一样,git fetch 拒绝获取当前分支,除非您提供 -u 选项。

这种行为在大多数情况下都非常合理,并且显然是正确的默认设置。但是,这不是我想要的行为。相反,我想要类似于配置选项receive.denyCurrentBranch=updateInstead 所做的事情:如果当前工作树和索引匹配HEAD,则允许获取和更新工作树;否则,使用与默认值类似的消息拒绝获取。有没有办法在不使用git fetch -u 编写我自己的瓷器命令的情况下做到这一点?


如果有更好的工作流程可用,我想要这个的原因是我正在处理存储在不同 Git 存储库中的多个项目。它们中的大多数都位于dev 本地分支上,该分支以dev/master 远程分支作为其上游。当我实际进行开发时,我会在以我正在开发的任何功能命名的分支上进行,而不是 dev 分支。我希望所有远程分支都可用,所以我需要定期执行git fetch --all -p,并且我还需要在我不构建的项目中执行git pull,以便他们拥有最新的代码。因为有很多项目,最简单的方法是在 Bash 中循环它们并在所有项目上运行 git fetch --all -p; git pull。不幸的是,这也会在我目前正在进行更改的项目上运行git pull,这可能会导致合并冲突,而不仅仅是获取最新的依赖项。

相反,我希望我目前未从事的项目能够自动更新工作树;那么我只需要在我目前正在处理的存储库上运行git pull。这样一来,我就可以只在合适的时候运行它,而当我只想针对依赖项目的最新源进行构建时,不用担心合并冲突。

【问题讨论】:

  • git fetch 本身从不更新索引和工作树。我想你可能确实需要在这里写你自己的瓷器。请注意,git-sh-setup 提供了一种方法来测试索引和工作树是否“干净”(匹配HEAD 提交),包括子模块,而无需解析git status 的输出。另请注意,git pull 或多或少只是git fetch && git merge,因此您可以测试而不是git pull,然后也许运行git merge
  • @torek 我之前没有真正写过自己的 Git 命令;有什么好的指南吗?
  • 有很多 bad 的 :-) 我不太确定有没有好的。不过,Git 的许多部分都是作为 shell 脚本编写的。运行git --exec-path 并查看生成的位置,您会发现stashfilter-branch 作为巨大的shell 脚本的示例。我要补充一点,如果您编写一个名为git-foo 的脚本并将其放在$PATH 的任何位置,git foo 将运行您的脚本(在$PATH 的前面添加git --exec-path 以便您可以@987654352 @,例如)。

标签: git git-fetch


【解决方案1】:

你可以开始使用git hooks并运行

git fetch -a

任何时候都需要

【讨论】:

  • 似乎没有任何钩子在 fetch 上运行,除非在远程推送上运行的钩子也在本地 fetch 上运行,但我没有看到任何地方记录。
【解决方案2】:

我还需要在我没有构建的项目中执行git pull,以便他们拥有最新的代码......不幸的是,这也在我目前正在更改的项目上运行git pull

你可以运行git pull --ff-only,如果有一些本地提交,它会立即失败。

【讨论】:

  • 我真的应该自己想到这一点,但不知道为什么我没有。它仍然不能完全满足我的要求,但它已经足够接近了,我认为它可以满足我的实际需求。
  • 并不是那么简单——我默认使用 pull-with-rebase,因为我需要在我工作的地方进行 rebase,我需要在命令行中添加 -c rebase.autoStash=no——但现在它可以工作了正是我想要的,我可以创建一个别名来同时进行提取。
猜你喜欢
  • 1970-01-01
  • 2013-05-19
  • 2016-09-09
  • 1970-01-01
  • 2016-09-29
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 2015-04-18
相关资源
最近更新 更多