2016-02-05 22 views
3

完整的问题重写
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)如果回购在落后时无法处理,则会出错;如果拉头被用于代替取得本地回购已被清空,像这样:

Local repo has been wiped when changing code to pull.

如果我离开取得本地回购保持它应有的方式:

Local repo the way it should stay after a push. Fetch was used here.

2)整个gh-pages目录被复制到gh-pages分支,而不仅仅是它里面的文件。

+0

可能重复[如何在git中提交后自动推送?](http://stackoverflow.com/questions/7925850/how-to-automatically-push-after-committing-in-git) – gzh

+0

@gzh this不是重复的。这不是要求如何推送,而是如何在正常推送时自动运行的其他命令。这些命令可以完成我的OP中提到的额外工作。 [那个问题](http://stackoverflow.com/questions/7925850/how-to-automatically-push-after-committing-in-git)是关于每次用户点击提交时自动执行整个Git循环,而不是提交掌握并同时克隆一个目录到一个完全不同的分支。 – Blizzardengle

+1

看来你需要写一个post-receive hook来完成这个任务。 – gzh

回答

1

你真的不需要这种复杂的方法。

只需在gh-pages分支(自a submodule can follow the latest commit of a branch起)后面添加您自己的回购作为子模块(自身!),子模块!

git checkout master 
git rm -r gh-pages # save your data first 
git submodule add -b gh-pages -- /remote/url/of/your/own/repo 
git commit -m "ADd gh-pages branch as submodule" 
git push 

这样的话,你可以改变文件不管是在你的主分支,或gh-pages文件夹(这实际上是一个子模块)

当你正在在gh-pages文件夹的变化,不要忘了在您的回购的主文件夹中执行,以便记录新的gitlinkspecial entry in the index),表示gh-pages子模块的新SHA1。

cd myrepo/gh-pages 
# modify files 
git add . 
git commit -m "modify gh-pages files" 
cd .. # back to myrepo folder 
git add gh-pages 
git commit -m "record gh-pages new SHA1" 
git push 

With git 2.7+,您可以设置:

cd /path/to/main/repo 
git config push.recurseSubmodules on-demand 

话单git push从你的主要回购将gh-pages子模块推到gh-pages分支。

后来,一个git clone将克隆的两种主要回购gh-pages分支(在gh-pages子模块文件夹)。

这样,您总是可以看到两个内容。

而且您不需要复杂的“同步/复制”机制。


更新2016年8月:Simpler GitHub Pages publishing现在可以保持你的页面文件在同一分支(没有更多gh-pages需要)的子文件夹:

Now you can select a source in your repository settings and GitHub Pages will look for your content there.

你不因为您的寻呼机可以位于同一分支内的子文件夹中,所以需要使用子模块方法。

+0

注意:这是我在2011年提到的旧方法(http://stackoverflow.com/a/8148319/6309),基于[Mark Longair](http:///stackoverflow.com/users/223092/mark-longair)的答案(http://stackoverflow.com/a/5296433/6309)。但是在那个时候,子模块并没有遵循分支,你不能一气呵成。 – VonC

+0

你在这里迷失了我:“每当你对gh-pages文件夹进行修改时,不要忘记在那里修改”。如果我在shell中运行你的代码,它会起作用,但是如果我尝试用Git for windows(桌面)做任何类型的正常提交,我会收到一个错误消息,说要使用shell添加子模型或删除.git文件 – Blizzardengle

+0

我试过这个答案但没有骰子:http://stackoverflow.com/questions/5542910/how-do-i-commit-changes-in-a-git-submodule – Blizzardengle

3

你写的钩子脚本有什么问题?分支gh-pages创建时的内容是什么?

我已经创建了一个空的分支GH-页面下面的命令:

git checkout --orphan gh-pages 
git rm -rf . 
touch README.txt 
git add README.txt 
git commit -m "Initial commit" 
git push -u origin gh-pages 

然后,我跑到下面的脚本的一部分后收到钩,它为我工作。

#!/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 
done 
+0

我不明白你的代码,所以我想你可能误解了。由于某种原因,我的钩子不会运行,但如果我在壳中运行所有这些,它还是有用的。它所做的只是将我整个主分支中的每个更改文件都复制到gh页面中,这不是我所需要的。 https://github.com/blizzardengle/barebones-framework – Blizzardengle

+0

我编辑我的问题,指出不工作的部分。 – Blizzardengle

+0

这从来没有工作,因为分支='git rev-parse --abbrev-ref HEAD'需要是$(git rev-parse --abbrev-ref HEAD)。它还复制了超过它应有的内容,即gh-pages目录。这是一个快速的解决方案,可以考虑答案,但@VonC答案更多的头脑。 – Blizzardengle

相关问题