Git 在并行进程仍有文件句柄时提交

Git commit while parallel process still has handle on file

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

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

有没有人能想出忽略仍在写入的文件的解决方案?我在 Windows

上有这个问题

谢谢!

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

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

I noticed that Git commits a blank file to the index/repo if a process is still accessing or modifying the file.

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

由于Git本身在这里没有什么特别的,你需要的是某种方式来知道写入进程已经完成写入并且没有新的写入进程开始写入。通常,这与任何文件级锁定无关:您希望 commit 成为跨 all 个文件的自洽快照。


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