Git 提交,而并行进程仍有处理文件的句柄

Posted

技术标签:

【中文标题】Git 提交,而并行进程仍有处理文件的句柄【英文标题】:Git commit while parallel process still has handle on file 【发布时间】:2021-04-10 21:09:02 【问题描述】:

我在自动化过程中使用 Git 将文件提交到存储库。在一个用例中,脚本正在将文件写入工作树,最终被重复出现的“提交”命令拾取。

我注意到如果进程仍在访问或修改文件,Git 会将一个空白文件提交到索引/存储库。我不知道脚本何时开始或结束编写过程。

有没有人能想到一个解决方案来忽略仍然写入的文件?我在 Windows 上遇到了这个问题

谢谢!

【问题讨论】:

【参考方案1】:

(这更像是一个评论而不是一个答案,但需要比评论更多的空间。)

这里 Git 的唯一特别之处在于 git commit 不使用工作树中的文件副本。相反,它使用 Git 索引中的文件副本。该副本是在一段时间前创建或更新的,当时您(或代表您工作的某个代理)运行 git add1 所以:

我注意到如果进程仍在访问或修改文件,Git 会将空白文件提交到索引/存储库。

... 可能发生的情况是 git add 在进程完成文件处理之前正在运行。这当然是同一个底层问题,只是同步所需的步骤涉及到写程序和git add这一步,而不是写程序和git commit这一步。

由于 Git 本身在这里没有做任何特别的事情,因此您需要通过某种方式来知道编写过程已经完成编写,并且没有新的编写过程开始编写。一般来说,这与任何文件级锁定无关:您希望 commit 成为跨 所有 个文件的自洽快照。


1git commit --includegit commit --onlygit commit -a 存在例外情况。但所有这些工作都是通过创建一个临时索引并使用git add(或内部等效项)添加到临时索引,然后使用临时索引提交。所以这些异常并不是真正的异常:它们仍然从索引提交,只是“the”索引现在是一个临时索引,而不是主索引。

【讨论】:

很抱歉回复晚了!我完全错过了那个答案,但因为这个问题再次出现在我面前,我又回来了,你的评论仍然是我想要的!再次感谢!!

以上是关于Git 提交,而并行进程仍有处理文件的句柄的主要内容,如果未能解决你的问题,请参考以下文章

并发编程之多进程

linux处理僵尸进程

进程互斥与同步

开始一个过程,而不是像孩子一样

文件句柄概述

修改操作系统句柄数和用户进程数