有没有办法防止因编辑器未自动更新而在git pull后意外覆盖文件?

8

当一个文件在编辑器中打开(例如Sublime或Atom),并且该文件在编辑器外被编辑时,编辑器通常会拒绝刷新其显示的文件。这种情况很少发生,因为大多数情况下人们只会在特定时间内使用单个工具来编辑文件。当文件是只读的时候显然不会出现这个问题。例如,当阅读系统错误日志时,文件将随着系统运行而更新,并可能有新的错误日志,但是日志文件不会被编辑,因此不会导致冲突。

然而,当文件被git pull更新时,就会出现问题。

当一个人拉取repo的最新更新时,他可能在编辑器中打开了一个文件,在更新中对该文件进行了一些更改。如果编辑器无法刷新文件,则文件将保存旧内容,任何新更改都将丢失。

有时,使用Sourcetree反向hunk只是令人烦恼,但当有多个文件被更新时,那些覆盖操作可能会不经意地推送到Git服务器中——直到出现错误。目前,我们正在使用git log --follow -p --file命令来查找和还原错误,但如果在及时发现覆盖操作之前就已经过期,这是不可能的,只能强制我们手动复制行。有没有办法在第一时间避免这种覆盖操作?


我会采用的解决方案是远离这种行为的编辑器。大多数现代IDE(Eclipse,IntelliJ,NetBeans等)都没有这个问题。 - Tim Biegeleisen
有没有 PHP 的其他选择?最好是免费的,所以 PHPStorm 不是一个选项。 - cytsunny
我认为即使是在 IntelliJ 中,我也见过这种情况发生几次,但从未成为值得担忧的大问题。我不知道你可以使用哪个编辑器来避免这种情况发生。Notepad++ 在这方面似乎表现得非常良好,即它不会吞噬你的更新。 - Tim Biegeleisen
一些成员使用Mac,因此Notepad++对他们来说不是一个选择。 - cytsunny
一个解决方法是在拉取之前关闭编辑器中的所有文件。如果编辑器与Git集成,这也是另一个选项。 - Tim Biegeleisen
2个回答

4
当一个文件夹被编辑器(主要是Sublime或Atom)打开并且代码在编辑器外被修改时,有时编辑器中的内容会刷新,但有时则不会。这正是讨论Atom的issue 3594所涉及到的问题。
file-watcher这样的Atom插件将有助于缓解此问题,当检测到编辑器外的修改时,它会提示重新加载每个文件。
对于Sublime Text,您可以在此收到报告的相同问题。该主题所提到的,在Windows上通过网络共享访问文件时,这个问题变得更加重要。 File Reloader可以提供帮助,但无法检测外部更改。 SublimeText线程提到了这个设置(2016)。
{ "always_prompt_for_file_reload": true }

但是当编辑器和保存的文件都发生更改时,这可能没有帮助:像Visual Studio Code这样的编辑器解决了这个问题:
如果在使用VSCode保存文件时两边都有更改(来自磁盘和编辑器),编辑器将警告您并进行文件比较,以便您决定该怎么做。
这就是为什么在SublimeText中(除了"always_prompt_for_file_reload"设置之外),您可能需要FileDiff插件。它允许将文件与已保存的文件进行差异比较: https://forum.sublimetext.com/uploads/default/original/3X/5/a/5a59f922e26fea423cc31ae5c1d744eca8205143.png

1
有没有一种方法可以在第一时间防止这种覆盖发生?
是的,如果您的编辑器无法通过文件系统中断进行检测,则可以通过每3秒轮询文件系统来执行它们。
在Notepad ++上编程时,这种故障非常明显,因此插件必不可少,它会定期检查文件系统中文件的更改。
对于Sublime Text和Notepad ++,插件如下:
1. https://packagecontrol.io/packages/Auto%20Refresh 2. https://superuser.com/a/592913/458103(文档监视器 => 开始监视)
我使用它们很长时间,因为要在几个文本编辑器/ IDE 上使用同一个文件。然后,在编辑器之间交替时,由于它们未从文件系统重新加载文件,我大多数时候都会丢失我的工作。但是安装了上述插件后,我再也没有遇到过这个问题,也没有注意到由于定期重新加载而出现性能问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接