是否有可能在没有先检查出来的情况下替换git分支的树?

时间:2016-12-13 03:34:10

标签: git github doxygen

对于github.io上的页面,通常在主存储库上使用名为gh-pages的分支来发布与特定存储库关联的网站。

在我当前的项目中,我执行以下步骤来更新github.io上托管的文档。

  1. 使用Doxygen在主分支上构建API文档。
  2. html目录移动到临时目录。
  3. 结帐gh-pages分行。
  4. 将临时目录的内容复制到项目目录。
  5. git commitgit push gh-pages分支。
  6. 再次结帐master分行。
  7. 是否可以一步将html目录的内容提交到gh-pages分支?

    请注意,我不希望将html目录的内容添加到master分支,因为它是生成的内容而不是源。

    我已经查看了this questionthis question,但他们似乎无法解决此问题。

    这实际上并不是this question的重复,因为这个问题涉及整个树替换而不是添加单个文件,我相信前一个操作可以比后者更清晰地完成。

2 个答案:

答案 0 :(得分:1)

在新的本地仓库中再次克隆远程仓库。 检查此新存储库中的分支gh_pages

使用您已经拥有的repo进行开发,就像现在使用它一样。

使用Doxygen在开发存储库的主分支上构建API文档,就像现在一样。如果可能,请配置进程以在存储第二个本地存储库的目录中生成输出。否则,在生成文档后,将生成的文档移动到第二个本地存储库。

在第二个存储库(文档存储库)中运行git add .; git commit; git push

每次需要时重复最后两步。

答案 1 :(得分:0)

我编写了以下脚本以避免使用其他工作目录,尽管@ axiac的答案是解决此问题的有效方法。

#!/bin/bash

# This script will take a directory and replace the contents of a non-current
# branch with it.
if [ "$#" -ne 3 ]; then
    echo \
    "Usage:  replace-branch <top level directory> <branchname> <commit message>"
    exit
fi

root="$1"
branch="$2"
msg="$3"

# First check if the index is polluted, since we will be using it.
save=HEAD
indexDiverges=$(git diff-index --cached  $(git rev-parse HEAD))
if [[ -n "$indexDiverges" ]]; then
    save=$(git write-tree)
fi

# Create a new index
git read-tree --empty
GIT_WORK_TREE=$root git add .

# Check whether the index is actually different from the target.
isDuplicateCommit=$(git diff-index --cached  $(git rev-parse $branch))
if [[ ! -n "$isDuplicateCommit" ]]; then
    echo "The branch already matches the state we are trying to commit!"
    git read-tree $save
    exit
fi

# Write the index out to a new tree
tree=$(git write-tree)

# Commit with the given commit message to the other branch
commithash=$(echo "$msg" | git commit-tree $tree -p $(git rev-parse $branch))

# Move the branch pointer.
git update-ref $(git show-ref --heads "$branch"  | awk '{print $2}') \
    "$commithash"

# Restore the index to its previous state
git read-tree $save

我还决定稍微升级一下并将其放在GitHub上,并附带示例用法。