windows - Git 提交,而并行进程仍然有文件句柄
问题描述
我在自动化过程中使用 Git 将文件提交到存储库。在一个用例中,脚本正在将文件写入工作树,最终被重复出现的“提交”命令拾取。
我注意到如果进程仍在访问或修改文件,Git 会将一个空白文件提交到索引/存储库。我不知道脚本何时开始或结束写作过程。
有没有人能想到一个解决方案来忽略仍然写入的文件?我在 Windows 上有这个问题
谢谢!
解决方案
(这更像是一个评论而不是一个答案,但需要比评论更多的空间。)
Git 的唯一特别之处在于git commit
它不使用工作树中的文件副本。相反,它使用 Git 索引中的文件副本。该副本是在一段时间前创建或更新的,当时您(或代表您工作的某个代理)运行git add
. 1 所以:
我注意到如果进程仍在访问或修改文件,Git 会将一个空白文件提交到索引/存储库。
...可能发生的事情是git add
在进程完成文件处理之前正在运行。这当然是同一个根本问题,只是同步所需的步骤涉及编写程序和git add
步骤,而不是编写程序和git commit
步骤。
由于 Git 本身在这里没有做任何特别的事情,因此您需要通过某种方式来知道编写过程已经完成编写,并且没有新的编写过程开始编写。通常,这与任何文件级别的锁定无关:您希望提交成为所有文件的自洽快照。
1此规则的例外情况与git commit --include
、git commit --only
和一起出现git commit -a
。但是所有这些工作都是通过创建一个临时索引并使用git add
(或内部等效项)添加到临时索引,然后使用临时索引提交。所以这些异常并不是真正的异常:它们仍然从索引提交,只是“the”索引现在是一个临时索引,而不是主索引。
推荐阅读
- c++ - 将可变参数模板类存储到 std::vector
- python - discord.py - 异步 def 协程不在 cogs 中运行
- android - 当应用程序未处于全屏模式(场景形式)时,锚点在 Galaxy s10 上移动
- javascript - 将 for 循环与事件侦听器一起使用:我如何解释它?
- python - Pydantic json 值在自定义枚举上为空
- r - 根据逻辑列的顺序在 DF 中创建多个新列
- c++ - for循环中的整数表现得很奇怪
- sas - SAS 和做循环
- php - Laravel 路由列表 (php artisan route:list) 在新行上显示中间件
- python - ModuleNotFoundError:没有名为“pgeocode”的模块