提问人:Thomas McQuitty 提问时间:9/30/2023 更新时间:9/30/2023 访问量:32
在预提交期间拆分 git commit
Break a git commit apart during pre-commit
问:
我正在与一个基于注释处理构建的系统进行交互。每个文件都需要它自己的注释,我可以从第三方系统捕获注释。
预提交脚本似乎是执行此操作的最佳方法,因为它不需要任何其他进程(例如外部脚本)来执行该操作。
像这样的答案似乎是合适的。如果我能在提交后这样做,它就会起作用。但是,我正在尝试在提交期间执行此操作。
理想情况下,用户将独立提交每个文件,但这不会发生。
我在 .git/hooks/pre-commit 中的代码执行:我得到一个文件列表并为每个文件执行:。git --diff-index --name-only HEAD
git add filename && git commit -m "unique comment" --no-verify
但是,如果我运行,我会得到以下内容:git status
$ git status
On branch dev
Your branch is ahead of 'origin/dev' by 1 commit.
(use "git push" to publish your local commits)
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: FINANCE/ACCTPAY/COBOL/RICK6.cbl
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: FINANCE/ACCTPAY/COBOL/RICK6.cbl
我应该做些什么吗?如果我在预提交后运行,问题就会消失,但我不希望这些用户一直运行该命令,并且它在预提交脚本中不起作用。git reset head
答:
一般来说,虽然可以在阶段进行一些有限的修改,但你绝对不应该,而且尝试进行多次提交可能行不通,并且会遇到索引锁的争用。它还可能会破坏您所做的提交,因为提交的父级可能不引用您添加的提交。无论如何,绝对不支持提交中的提交,即使它现在工作,由于工作方式的细微变化,也可能随时中断。pre-commit
git commit
git commit
解决此问题的最好方法是改变构建方式,以便人们可以编写有意义的、合乎逻辑的提交。工具应该是灵活的,可以做困难的工作,这样人类就不必这样做了,而不是强迫人类做无意义的工作来安抚工具。您可以向构建系统添加预构建步骤,以提取注释并将提交拆分为单独的文件,这些文件一次构建一个(如果需要),而不是拆分存储库中的工作。通常,所有关于如何以及在何处构建的困难决策都应在构建系统中处理,而不会影响提交工作流。
如果您绝对必须执行此类操作,则可以编写自己的工具,方法是使用临时文件将单个更改读取到索引中,并使用 和更新临时索引,然后使用 编写树,最后使用 创建提交。这些是适合编写脚本的工具,但它们的级别非常低。 不打算编写脚本,因为它是一个瓷器命令。GIT_INDEX_FILE
git read-tree
git update-index
git write-tree
git commit-tree
git commit
如果采用此方法,则可能需要在 CI 系统中强制执行提交工作流,以便用户不会意外编写包含多个文件的提交。
评论