推–force-with-lease默认

我刚刚了解到git push --force-with-lease 。 这真是太棒了。 但是,当然,我不经常使用武力,所以我担心下次需要时可能会忘记这个漂亮的function。

有没有办法configuration混帐,所以git push -f会自动使用--force-with-lease除非我故意用--no-force-with-lease覆盖它?

(我无法想象,如果没有租约,就想用武力!)

AFAIK没有可用的configuration告诉git总是使用force-with-lease而不是force force-with-lease 。 这似乎是一个function请求的好例子; 如果你没有任何问题可以深入git代码库,你可以自己实现,并提交审查。

编辑就目前而言,这仍然是在2017年3月。

在那之前,我看到的唯一select就是经常创build一个alias来满足这个目的。

创build一个别名

要创build一个别名,可以使用git config --global alias.<alias-name> <command> ,在我们的例子中,我会build议类似的东西。

 git config --global alias.pushf "push --force-with-lease" 

这将在您的全局.gitconfig文件(通常可以在您的主目录中find)中创build一个条目。 在这之后,你可以简单地使用git pushf强制使用租约

把你的手弄脏

如果你想自己实现这个特性,但是不确定从哪里开始,你应该首先看一下git仓库中的文档目录 。 在这里你可以find编码指南和如何提交补丁的信息

你可以在官方社区页面find所有这些链接和更多。

我担心下次需要时可能会忘记这个漂亮的function。

Git 2.13(2017年第2季度)解释了为什么没有“保护”这个被推掉的选项被遗忘,因为即使你没有把它忘记在git push level,它仍然可以被忽略。

参见ÆvarArnfjörðBjarmason( avar )的 提交f17d642 (2017年4月19日) 。
(由Junio C gitster合并- gitster -在2017年4月26日的第46bdfa3期 )

push :文件和testing--force-with-lease与多个遥控器--force-with-lease

对于有两个远程指向同一个URL的情况进行文档和testing,并且后台获取和随后的git push --force-with-lease不应该破坏我们还没有获取的未更新的引用。

一些像微软的VSC这样的编辑器有一个在后台自动获取的function,这就避免了在这里添加的文档中提到--force-with-lease--force-with-lease=<refname>提供的保护。

所以git push的文档现在包括:

关于安全性的一般注意事项:提供这个选项没有预期的值,例如--force-with-lease或者--force-with-lease=<refname>与任何隐式地运行git fetch东西交互非常糟糕在后台,例如git fetch origin在你的仓库中的cronjob中git fetch origin

它所提供的保护措施过于--force是确保您的工作不基于的后续更改不被破坏,但是如果某些后台进程正在更新后台中的refs,则会被轻微地击败。 除了远程跟踪信息外,我们没有其他任何东西可以作为启发式的参考,预计你会看到并且愿意闯入。

如果你的编辑器或其他系统在后台为你运行git fetch ,一种方法就是简单地设置另一个remote:

 git remote add origin-push $(git config remote.origin.url) git fetch origin-push 

现在,当后台进程运行git fetch originorigin-push上的引用不会被更新,因此命令如下:

 git push --force-with-lease origin-push 

除非你手动运行git fetch origin-push否则会失败。
这个方法当然完全被运行git fetch --all的东西所git fetch --all – 在这种情况下,你需要禁用它,或者做一些更乏味的事情,比如:

 git fetch # update 'master' from remote git tag base master # mark our base point git rebase -i master # rewrite some commits git push --force-with-lease=master:base master:master 

也就是为上游代码的版本创build一个base标记,并且愿意覆盖,然后重写历史logging,并且如果远程版本仍然在base ,则强制将更改推送到master ,而不pipe本地的remotes/origin/master已经更新到后台。