【发布时间】:2016-02-05 04:44:20
【问题描述】:
完成问题重写
所以我以为我是在非常简单直接地解释这个问题,但似乎我过于简单化了,所以这里是所有额外的细节。希望这可以帮助大家看到这也不是重复的。
我有一个存储库(项目),我想在其中自动化将提交从一个分支中的一个目录推送到另一个分支的过程;我在 SO 上还没有遇到过的东西。
这是我的完整结构的项目:
[PROJECT MASTER BRANCH]
|- gh-pages (directory)
|- css (directory)
|- index.html (file)
|- readme.md (file)
[PROJECT gh-pages BRANCH]
|- (empty at the moment)
我希望做的是创建一个钩子,它会自动处理我的 gh-pages 目录中来自 master 分支的更改,并将它们复制/克隆/替换它们(无论使用哪个正确的术语)到 gh-pages 分支,项目网站分支。这是一个省略了所有其他文件的示例:
[PROJECT MASTER BRANCH]
|- gh-pages (directory) <=== SEE UPDATE BELOW [A]
| |- css (directory)
| | |- style.css (file)
| |- index.html (file)
[PROJECT gh-pages BRANCH]
|- css (directory) <=== SEE UPDATE BELOW [B]
| |- style.css (file)
|- index.html (file)
我对这一级别的 Git Hub 完全陌生。我通常只坚持基础,从不使用终端/外壳。因此,总而言之,为了澄清我希望做的事情,我想:
- 只需要在[Master Branch]工作。我需要在 [Master Branch] 的 gh-pages 目录中对 [gh-pages Branch] 进行的所有更改
- 最好通过添加一个似乎是接收后挂钩的简单文件来完成此操作?
这是我尝试使用的一些接收后挂钩代码(我通过研究一些东西来实现)但它不起作用:
#!/bin/bash
while read oldrev newrev refname
do
branch=$(git rev-parse --symbolic --abbrev-ref $refname)
if [ "master" == "$branch" ]; then
git checkout gh-pages
git checkout master -- gh-pages
git add gh-pages
git commit -m "Updating project website from 'master' branch."
fi
done
注意
正如我在评论中提到的:这不是重复的。这不是在问如何推送,而是在问我进行正常推送时如何处理自动运行的其他命令。这些命令将完成我的 OP 中提到的额外工作。
更新
我已将这些箭头添加到我在下面引用的部分代码中:
[A] 这里应该发生的是,Git 应该递归地读取主分支 gh-pages 目录,并且只将更新的内容(或者如果更容易的话)复制到 gh-页面分支。
[B] 因此,如果 master 中的 gh-pages 目录有一个 index.html 文件和一个带有 style.css 文件的 css 文件夹,则应该只复制该结构而不是 gh-pages目录本身。下面是一个也复制 gh-pages 目录的错误钩子的示例:
[PROJECT gh-pages BRANCH]
|- gh-pages (Directory) <=== NOT SUPPOSED TO HAPPEN
| |- css (directory)
| | |- style.css (file)
| |- index.html (file)
此外,钩子不应复制任何其他文件,而是复制 gh-pages 内的内容。即使在 master 分支中更改了其他几个文件,也应该只复制 gh-pages 目录文件。
[C] 新代码 - 这可行,但会导致错误:
#!/bin/bash
branch=$(git rev-parse --abbrev-ref HEAD)
if [ "master" == "$branch" ]; then
git fetch && git checkout gh-pages
git checkout master -- gh-pages/*
git add -A
git commit -m "Updating project website from 'master' branch."
git push -u origin gh-pages
fi
这不起作用有两个原因。 1)如果repo在提交上落后,它无法处理,它会出错;如果使用 pull 而不是 fetch,则本地 repo 会像这样被擦除:
如果我离开 fetch 本地 repo 保持它应该的方式:
2) 整个 gh-pages 目录仍然被复制到 gh-pages 分支,而不仅仅是其中的文件。
【问题讨论】:
-
@gzh 这不是重复的。这不是在问如何推送,而是在问我进行正常推送时如何处理自动运行的其他命令。这些命令将完成我的 OP 中提到的额外工作。 That question 是关于在每次用户点击提交时自动化整个 Git 周期,而不是提交到 master 并同时将目录克隆到一个完全不同的分支。
-
看来你需要写一个post-receive hook来完成这个任务。
-
@gzh 凹凸。改写了问题。接收后挂钩很有意义,但我不知道如何实现它。
-
钩子脚本应该在 $your_repo/hooks/post-receive 目录下,那么你的钩子脚本的运行目录是什么,你的结帐代码将放在哪里?我认为你应该创建一个新文件夹,克隆源代码并做你想做的事。
标签: git github configuration