Git - 如何自动将目录中的更改推送到另一个分支

Bli*_*gle 5 git configuration github

完成问题重写

所以我认为我非常简单直接地解释了这个问题,但似乎我过于简单了,所以这里是所有额外的细节.希望这有助于每个人看到这也不是重复.


我有一个存储库(项目),我希望自动化将提交从分支中的一个目录推送到另一个分支的过程; 我还没有遇到过的东西.

这是我的项目的完整结构:

[PROJECT MASTER BRANCH]
|- gh-pages    (directory)
|- css         (directory)
|- index.html  (file)
|- readme.md   (file)

[PROJECT gh-pages BRANCH]
|- (empty at the moment)
Run Code Online (Sandbox Code Playgroud)

我希望做的是创建一个钩子,它将从主分支中自动处理我的gh-pages目录中的更改,并通过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)
Run Code Online (Sandbox Code Playgroud)

我对这个级别的Git Hub完全陌生.我通常只是坚持基础,从不使用终端/外壳.总而言之,为了澄清我希望做的事情,我想:

  • 只需要在[Master Branch]工作.我需要对[gh-pages Branch]进行的所有更改我在[Master Branch]的gh-pages目录中进行的更改
  • 最好通过添加一个似乎是post-receive hook的简单文件来实现这一点?

这是我尝试使用的一些post-receive钩子代码(我是通过研究一些东西来实现的)但它不起作用:

#!/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
Run Code Online (Sandbox Code Playgroud)

注意
如我的评论中所述:这不是重复.这不是问如何推动,而是如何在我正常推送时自动运行的其他命令.这些命令可以完成我的OP中提到的额外工作.

更新
我已将这些箭头添加到我在下面引用的部分代码中:<===

[A]这里应该发生的是Git应该递归地读取主分支gh-pages目录,并且只从已更新的内容(或者更容易的内容)复制到gh-pages分支中.

[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)
Run Code Online (Sandbox Code Playgroud)

此外,钩子不应该复制任何其他文件,但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
Run Code Online (Sandbox Code Playgroud)

这不会有两个原因.1)如果repo落后于提交它无法处理它,它将会出错; 如果使用pull而不是fetch,则本地repo会被擦除:

在更改代码时,已擦除本地仓库.

如果我离开fetch,本地仓库将保持应有的方式:

本地回购按推销后应保留的方式. 这里使用了Fetch.

2)整个gh-pages目录仍然被复制到gh-pages分支,而不仅仅是其中的文件.

Von*_*onC 6

您确实不需要这种复杂的方法。

只需将您自己的存储库添加为子模块(本身!),子模块跟随分支gh-pages(因为子模块可以跟随分支的最新提交)!

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
Run Code Online (Sandbox Code Playgroud)

这样,您可以在主分支或gh-pages文件夹(实际上是子模块)中更改文件

每当您在文件夹中进行更改时gh-pages,请不要忘记在该文件夹以及存储库的主文件夹中提交,以便记录代表子模块的新 SHA1 的新gitlink索引中的特殊条目gh-pages) 。

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
Run Code Online (Sandbox Code Playgroud)

使用 git 2.7+,您可以设置:

cd /path/to/main/repo
git config push.recurseSubmodules on-demand
Run Code Online (Sandbox Code Playgroud)

git push然后,主存储库中的单个子模块也会gh-pages将子模块推送到gh-pages分支。

稍后,一个git clone将克隆您的主存储库及其分支gh-pages(在gh-pages子模块文件夹中)。

这样,您始终可以看到这两个内容。

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


2016 年 8 月更新:更简单的 GitHub Pages 发布现在允许将页面文件保存在同一分支的子文件夹中(不再gh-pages需要):

现在,您可以在存储库设置中选择源,GitHub Pages 将在那里查找您的内容。

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


归档时间:

查看次数:

1402 次

最近记录:

9 年,2 月 前