我正在尝试对远程分支进行空提交。我不想在本地进行更改然后将其推送。我不想对我的本地工作树进行任何更改。
这是我所拥有的:
const tree = await octokit.rest.git.getTree({
owner: GITHUB_OWNER,
repo: GITHUB_REPO,
tree_sha: "myBranch",
})
const commitObject = await octokit.rest.git.createCommit({
owner: GITHUB_OWNER,
repo: GITHUB_REPO,
message: "my commit message",
tree: tree.data.sha,
})
基本上,我试图获取分支的树
myBranch
,然后使用该树创建一个新的提交(没有更改),只需一条提交消息。
我目前收到错误:
RequestError [HttpError]:树 SHA 不是树对象
如果我要在本地执行此操作,我会这样做:
git co -b myBranch origin/myBranch
git commit --allow-empty -m "my commit message"
git push origin myBranch:myBranch
然而,这涉及到弄乱我的本地工作树,我希望这是一个可以运行的脚本,而不必担心本地工作树中有哪些分支或更改。
如果有一种方法可以使用原始 git 来实现此目的,而不使用 octokit,那也很好。
您完全可以使用原始 Git 来完成此操作,但您需要编写一些额外的脚本。 Git 提供了管道命令来更新索引、创建树和创建提交。
下面的脚本采用两个参数,一个分支名称和一个提交,并在给定分支上创建一个空提交,该分支将上一个提交作为其父级。不会对本地工作树进行任何更改,即使在裸存储库中也可以工作。
您还可以按照指示修改脚本,以使用
git hash-object
(将文件添加到存储库)和 git update-index
(将文件添加到索引)等工具修改创建的提交。临时索引文件用于避免更改存储库中的主索引文件。
临时目录和索引仅在您确实想要对提交进行更改时使用;如果您实际上没有修改提交的内容,则可以省略它们。
#!/bin/sh -e
tempdir=$(mktemp -d)
trap 'rm -fr "$tempdir"' EXIT
COMMIT="${2:-HEAD}"
export GIT_INDEX_FILE="$tempdir/index"
# To make changes to the commit:
# git read-tree "$COMMIT"
# Make any changes here, such as with `git update-index`.
# tree=$(git write-tree)
# To use the same contents as the previous commit:
tree=$(git rev-parse --verify "$COMMIT^{tree}")
# Either way:
commit=$(git commit-tree -m "commit message" -p "$COMMIT" "$tree")
git update-ref "refs/heads/$1" "$commit"
但是,我要补充一点,除了非常有限的情况外,您通常不想创建空提交。无论您的目标是什么,您通常应该首先研究其他替代方案。