2016-02-05 54 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

相關問題