首页 > 解决方案 > Git 提交,而并行进程仍然有文件句柄

问题描述

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

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

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

谢谢!

标签: windowsgitfile-lockingfilelock

解决方案


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

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

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

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

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


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


推荐阅读