git - git pull 是否以原子方式写入文件

标签 git version-control

我在文档中找不到任何内容。 如果我执行 git pull,我是否保证 merge 后的底层文件是原子写入的?

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

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

最佳答案

简短的回答是

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

所以这真的归结为:git checkout 在操作系统级别是原子的吗? 答案是非常响亮的否: 它不是以任何方式原子。写入工作树中的单个文件一次写入一个,使用操作系统级别的 write 调用,这些调用不是原子的。需要创建或删除的文件一次完成一个。 Git确实使用索引,它索引(即,保持标签)工作树,以最大限度地减少删除、创建或就地重写的文件数量。 Git 还锁定其他 Git 操作,并使 Git 级别的事务看起来是原子的——但是任何在 Git 之外工作的、不与 Git 的锁定系统合作的东西,都能够在发生更改时看到它们.

关于git - git pull 是否以原子方式写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49362006/

相关文章:

git - 在 SourceTree 上切换分支名称

git - merge 两个存储库(原始项目和没有历史记录的更改项目)

git - 缩进 Bash 脚本输出

git - 如何在新的 Visual Studio 2019 的新 git 体验界面中添加要提交的工作项

git 知道但(远程)svn 忽略

git - 在 Git 版本控制中忽略父目录

python - 如何使用 GitPython checkout 标签

java - 使用Ant进行Java部署:帮助进行版本控制,测试等,以实现更好的构建

version-control - 为什么有人会通过提交日志创建问题?

version-control - 是否存在用于比较功能而不是行号的合并工具?