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

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

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

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

谢谢!

【问题讨论】:

    标签: windows git file-locking filelock


    【解决方案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”索引现在是一个临时索引,而不是主索引。

    【讨论】:

    • 很抱歉回复晚了!我完全错过了那个答案,但因为这个问题再次出现在我面前,我又回来了,你的评论仍然是我想要的!再次感谢!!
    猜你喜欢
    • 2014-01-18
    • 2012-08-14
    • 2020-01-09
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    • 2015-03-10
    相关资源
    最近更新 更多