【发布时间】:2017-11-02 17:29:41
【问题描述】:
与其他地方的 documented 和 discussed 一样,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并查看生成的位置,您会发现stash和filter-branch作为巨大的shell 脚本的示例。我要补充一点,如果您编写一个名为git-foo的脚本并将其放在$PATH的任何位置,git foo将运行您的脚本(在$PATH的前面添加git --exec-path以便您可以@987654352 @,例如)。