2012-10-02 63 views
1

我有以下設置,我正在處理子項目submodule的項目project。無論何時我將更改推送到github,它都會向服務器上的update.php發送一個post請求。git submodule在網絡服務器上自動提交併提交

這個php文件執行一個git命令。沒有子模塊,我可以做一個git pull,一切都很好,但是對於子模塊來說,它要困難得多。

我現在有這個,但它沒有做我想要的。我應該拉回購和更新並拉動每個子模塊的最新版本。

<?php echo `git submodule foreach 'git checkout master; git pull; 
git submodule update --init --recursive; git commit -m "updating"' && git pull && 
git submodule foreach 'git add -A .' 
&& git commit -m "updating to latest version including submodules" 2>&1s`; 

編輯// 好,我知道有一半的方式完成。

<?php echo `git submodule foreach 'git checkout master; git pull; 
git submodule update --init --recursive; git commit -am "updating"; echo "updated"' && 
git pull && git commit -am "updating to latest version including submodules" && 
echo 'updated'`; 

echo會阻止腳本因返回非零而停止。當我使用php update.php從控制檯運行它時,它可以100%正常工作。

當github初始化文件,或者我從瀏覽器運行它仍然不起作用。

任何想法?

+0

它是什麼呢? 您是否嘗試過切換'git pull'和第一個'git submodule foreach ...'? 第二個'git submodule foreach ...'沒有'git commit'。 – Michael

+0

我試了一下,既然它工作正常,從控制檯運行它應該實際上不是在腳本中的問題吧?它可能與權限有關嗎?如果是這樣,我該如何解決? –

+0

你說「沒有子模塊(...)一切正常」,所以我猜Web服務器具有所需的權限。運行時間的腳本怎麼樣?它停在哪裏? – Michael

回答

2

即使它的工作有一些事情你應該知道:

  1. 如果有新的子模塊,你不初始化他們。所以你應該開始你的腳本git pull && git submodule update --init

  2. git commit -am "updating"不會創建新的提交,因爲您沒有更改子模塊中的任何內容。

    • git checkout master僅檢查出的分支。這是有道理的,因爲否則分開的頭。

      備註:有可能會有回購主人不是你想要的分店!見下面的註釋。

    • git pull從遠程獲取並將更改合併到主。即使這不是一個快進合併¹,由於合併提交是自動完成的,因此沒有任何提交。

      ¹因爲這是在您的服務器上籤出,所以不需要進行非快進合併。否則,你應該考慮合併衝突和git push(見3)!

    • git submodule update --init --recursive只從子模塊的子模塊中取出遙控器並檢出已經引用的提交。因此,在這裏也沒有什麼新意可言。

  3. 如果git commit -am "updating"居然會創建一個提交,提交將只在簽出的版本(叉)提供,而不是在引用庫(見url = ….gitmodules)。因此,您在git commit -am "updating to latest version including submodules"中提交了對其他地方不存在的子模塊提交哈希的引用。

    因此,在這種情況下,你需要一個git push添加到您的git submodule foreach '…'。另見here

  4. 正如我在你的問題這個工作流程有一個主要缺點的評論中提到的:沒有人測試的項目文件中的子模塊的最新提交。這可能會破壞項目!

嘗試(縮進爲更好的可讀性):

<?php echo `git pull && 
    git submodule update --init && 
    git submodule foreach 'git checkout master; 
    git pull; 
    git submodule update --init --recursive; 
    echo "updated"' && 
    git commit -am "updated submodules" && 
    echo 'updated'`; 
?> 

注意的權限:

你說這工作(與子模塊)使用PHP CLI時。你在本地機器上還是在服務器上嘗試過?如果你在服務器上這樣做了,你是否使用網絡服務器的帳戶來嘗試它?在子模塊的分支

注:

使用git checkout master(見2.1)可以讓你只使用一個子模塊的主分支。要更改此項,請將update = rebaseupdate = merge添加到.gitmodules中的每個條目。 (不再有分離頭!)然後運行git submodule foreach 'git checkout master'(或檢出/創建任何其他跟蹤分支),從現在開始,您可以簡單地使用git submodule foreach 'git pull'

+0

完美,我只是把它變得複雜感謝你的提示與rebase我只是使用'git submodule foreach git pull'來包含我的repo和服務器上的更改運行一個簡單的'echo git pull && git submodule update - init --recursive 2>&1;'它一切正常。謝謝。 –