dau*_*ama 1 git version-control
我在文档中找不到任何内容。如果我执行 git pull,我能保证合并产生的底层文件是原子写入的吗?
关于我要实现的目标的更多上下文:我有一些脚本会定期执行 git pull,我需要知道我是否可以依赖在 pull 期间文件的状态是否有效。
我们基本上使用 git 作为部署工具。我们从来没有设计过合并冲突。在远程端,一个作业每隔 x 秒不断拉取一次,其他作业读取文件。可能发生的情况是我们在 git 拉取文件时打开了一个文件,但文件的内容不是我们所期望的。除非 git 足够聪明,可以在底层操作系统上使用一些原子交换(在这种情况下是 RedHat)
简短的回答是否定的。
值得考虑的是,这git pull根本不是关于文件,而是关于commits。文件只是一个副作用。:-) pull 操作只是git fetch(获取提交)后跟第二个 Git 命令,通常是git merge. 合并步骤合并提交。如果操作不是快进而不是合并,这也会产生合并文件的副作用;然后当合并或快进完成时,Git 会git checkout执行结果提交。
所以这真的归结为:在操作系统级别是git checkout原子的吗? 答案是一个非常响亮的不:它在任何方面都不是原子的。写入工作树的单个文件一次写入一个,使用write非原子的操作系统级调用。需要创建或删除的文件一次完成一个。Git确实使用索引,它索引(即,保持标签)工作树,以最大限度地减少删除、创建或就地重写的文件数量。Git 还锁定其他Git操作,并使 Git 级别的事务看起来是原子的——但是在 Git 之外工作的任何东西,如果不与 Git 的锁定系统配合,将能够在更改发生时看到它们。
| 归档时间: |
|
| 查看次数: |
559 次 |
| 最近记录: |