git pull 会自动写入文件吗

dau*_*ama 1 git version-control

我在文档中找不到任何内容。如果我执行 git pull,我能保证合并产生的底层文件是原子写入的吗?

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

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

tor*_*rek 6

简短的回答是否定的

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

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

  • 请注意,假设您有原子重命名,您可以使用单独的工作树(具有单独的索引文件)和“重命名”操作来构建自己的原子性。这里的想法是将新的工作树(使用新的空索引)检出到一个可以与当前树位于同一位置的空临时目录中。然后,您将“使用中”树重命名为不碍事,并将新树重命名到位。当根本没有 * 没有 * 树时,有一个简短的窗口,但除非您的操作系统提供“交换名称”操作,否则它会尽可能小。 (2认同)