推–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 origin
,origin-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
已经更新到后台。