完整的问题重写
Git的 - 如何自动推送的变化在一个目录到另一个分支
所以我想我是非常简单和直接的解释这个问题,但似乎我过于简单得多,所以这里是所有额外的细节。希望这可以帮助大家看到这也不是重复的。
我有一个储存库(项目),我想自动推从一个目录提交的一个分支到另一个分支的过程;这是我还没有遇到的东西。
这里是我的项目,其完整的结构:
[PROJECT MASTER BRANCH]
|- gh-pages (directory)
|- css (directory)
|- index.html (file)
|- readme.md (file)
[PROJECT gh-pages BRANCH]
|- (empty at the moment)
我所希望做的是创造了一个钩子,将自动从主分支处理我的GH-网页目录的变化,以及复制/克隆/由项目网站分支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枢纽。我通常只是坚持基础知识,从不使用终端/外壳。因此,总结澄清我希望做什么,我想:
- 只需要在[主分支]工作。我需要对[gh-pages分支]做出的所有更改我在[Master Branch]的gh-pages目录中执行
- 最好通过添加一个简单的文件来完成此操作,该文件似乎是post-receive hook?
下面是一些后收到,我尝试使用(我从学习一些东西做的话),但它不工作挂钩代码:
#!/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中提到的额外工作。
UPDATE
我已经添加了这些箭头的我的代码部分我指的是如下:< ===
[A]我应该在这里发生的是,Git的应递归读取的主分支gh-pages目录,并且只从那个已经更新的东西(或者所有东西如果更简单)复制到gh-pages分支中。
[B]因此,如果master中的gh-pages目录具有index.html文件,并且具有style.css文件的css文件夹应该仅复制该结构而不是gh-pages目录本身。下面是一个坏挂钩,复制GH-页面目录过的例子:
[PROJECT gh-pages BRANCH]
|- gh-pages (Directory) <=== NOT SUPPOSED TO HAPPEN
| |- css (directory)
| | |- style.css (file)
| |- index.html (file)
此外,钩子应该不超过任何其他文件副本,但什么是GH-页面中。即使在主分支中更改了其他几个文件,也应该只复制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)如果回购在落后时无法处理,则会出错;如果拉头被用于代替取得本地回购已被清空,像这样:
如果我离开取得本地回购保持它应有的方式:
2)整个gh-pages目录被复制到gh-pages分支,而不仅仅是它里面的文件。
可能重复[如何在git中提交后自动推送?](http://stackoverflow.com/questions/7925850/how-to-automatically-push-after-committing-in-git) – gzh
@gzh this不是重复的。这不是要求如何推送,而是如何在正常推送时自动运行的其他命令。这些命令可以完成我的OP中提到的额外工作。 [那个问题](http://stackoverflow.com/questions/7925850/how-to-automatically-push-after-committing-in-git)是关于每次用户点击提交时自动执行整个Git循环,而不是提交掌握并同时克隆一个目录到一个完全不同的分支。 – Blizzardengle
看来你需要写一个post-receive hook来完成这个任务。 – gzh