git pull原子地写文件

时间:2018-03-19 11:34:29

标签: git version-control

我在文档中找不到任何内容。 如果我做一个git pull,我保证合并产生的底层文件是自动编写的吗?

关于我想要实现的目标的更多背景: 我有一些脚本定期执行git pull,我需要知道在拉动期间是否可以依赖文件的状态。

我们基本上使用git作为部署工具。我们从来没有设计合并冲突。在远程端,作业不断拉动每x秒,其他作业读取文件。可能发生的是我们在git提取文件时打开文件,文件内容不是我们所期望的。 这是除非git足够聪明,可以在底层操作系统上使用一些原子交换(在本例中为RedHat)

1 个答案:

答案 0 :(得分:4)

简短回答是

值得考虑的是git pull根本不是关于文件的,而是提交。文件只是副作用。 :-) pull操作只是git fetch(获取提交),然后是第二个Git命令,通常是git merge。合并步骤合并提交。如果操作不是快进而不是合并,这也有合并文件的副作用;然后当合并或快进完成时,Git会对结果提交进行git checkout

所以这真的归结为:在操作系统级别是git checkout原子?答案非常响亮 no:它不是以任何方式原子。使用操作系统级write调用一次一个地写入在工作树中编写的单个文件,这些调用不是原子的。需要创建或删除的文件一次完成一个。 Git 使用索引,索引(即,保持标签)工作树,以最小化删除,创建或重写的文件的数量。 Git还会锁定其他 Git 操作,并使Git级别的事务看起来是原子的 - 但是在Git之外的任何不与Git的锁定系统配合工作的东西都能看到发生变化。