本文来自依云's Blog,转载请注明。
之前一直觉得 git 是很安全的,除非用户显式指定(比如 --force 啦,reset --hard 啦,checkout xxxx 啦),git 在用户会失去数据时都会停下来,让不小心的用户有机会处理被遗忘的修改。直到有一天,我们有个文件让 git 给吃了!
嗯,是「我们」,不是「我」。这是我们的代码部署服务器上出的事。这仓库不是我使用的,整个操作流程我也没有参与设计与评估。实际上我只是作为 troubleshooter 参与到这次神秘事件之中的。
要让 git 愉快地吃掉数据,只要这样就可以了:
- 提交 A 不包含文件 f
- 提交 B 包含文件 f
- 当前工作区为提交 A,并且包含一份未被 git 管理的文件 f,并且 f 被 gitignore 忽略掉了
然后做如下操作,未被管理的那份 f 就会消失不见了:
- 将工作区切换到提交 B。因为 f 被忽略,所以 git 不会报错(代码)
- 将工作区再切换回 A。因为 A 不包含 f,所以 f 被删掉了
正在吃 f 的 git:主人遗弃了的 f 就交给我好了~
要避免出现这种问题,当然是在 git 工作区会有修改的时候,不要依靠 git 来在多个版本间切换啦~btrfs 或者 zfs 的快照多好!如果文件系统不支持快照的话,那就用多个目录吧。
Nov 10, 2016 05:06:20 PM
为什么不把命令贴出来呢?这样看着好乱
Nov 10, 2016 05:18:15 PM
摸摸... 以后再也不鄙视用两个目录的人了....
Nov 10, 2016 06:22:46 PM
因为测试过程没有记录,所以这部分就交给读者去补充啦~
(又不是很麻烦
Nov 10, 2016 06:23:08 PM
呃,用户是机器不是人的说~
Nov 11, 2016 09:52:47 AM
之前遇到过这个情况。这个算是设计未考虑周全吗?
Nov 11, 2016 10:10:51 AM
我觉得还好。被排除的文件注定是短命的。
Nov 17, 2016 08:33:41 PM
Nov 17, 2016 08:43:56 PM
git: :yum:
Nov 18, 2016 10:40:09 AM
MySQL: 咦这是什么字符,怎么有四个字节啦?吃掉吃掉~
Nov 23, 2016 07:29:52 AM
雾草,仙酱这个是自定义域名啊。。
Nov 23, 2016 09:43:48 AM
嗯~
Nov 23, 2016 02:07:35 PM
我也碰到过类似的问题,之前把 config.py 这个自定义的配置文件不小心存到了git里面,然后删掉后同步到服务器上,结果把服务器的config.py也给弄没了。
Nov 25, 2016 12:40:48 PM
刚试了下, 果然如此。。 试图去找被抹掉得文件.. 无果, 应该是直接覆盖了, 没留下任何记录
Dec 09, 2016 02:00:12 AM
之前也被坑过,记录见:http://tangzx.qiniudn.com/koans.html#git-%E4%BD%A0%E4%B9%9F%E5%9D%91%E6%88%91
checkout 的时候会提醒你,但如果你是 checkout 到一个新的分支(orphan)……不提醒。