Octokit/git 添加空提交到远程分支?

问题描述 投票:0回答:1

我正在尝试对远程分支进行空提交。我不想在本地进行更改然后将其推送。我不想对我的本地工作树进行任何更改。

这是我所拥有的:

  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 github octokit-js
1个回答
0
投票

您完全可以使用原始 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"

但是,我要补充一点,除了非常有限的情况外,您通常不想创建空提交。无论您的目标是什么,您通常应该首先研究其他替代方案。

© www.soinside.com 2019 - 2024. All rights reserved.