簡體   English   中英

git post-update腳本不起作用

[英]git post-update script does not work

在編輯了我的舊問題幾次之后,我創建了一個新問題,因為它現在是一個新問題。

.git/hooks/post-update我有:

echo "a" >> /home/pi/log
git update-server-info
git stash
git merge testing >> /home/pi/log

進行自動結賬。 所以我在客戶端上運行:

git push testing HEAD:testing

現在我的/home/pi/log包含:

a
Updating ae2f44b..04753a9
Fast-forward
 application/views/main/index.php |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

但文件沒有改變!

$ git merge testing
Already up-to-date.

如果我刪除腳本,進行推送並運行git stashgit merge testing就可以了。

更新

為了測試,我將文件中的數字從17更改為20.如果我運行,我可以看到正確的文件版本

git show application/views/main/index.php

vim application/views/main/index.php

仍包含舊號碼。 但是git聲稱該文件已更新:

$ git merge testing
Already up-to-date.

編輯

看起來這是你的問題

  pre-receive update post-receive post-update 

這些掛鈎可以在裸存儲庫或非裸存儲庫中運行。 在這兩種情況下,當前工作目錄都是git目錄。 所以,如果這是一個名為“/src/git/test.git/”的裸存儲庫,那將是當前的工作目錄 - 如果這是一個非裸存儲庫,並且工作樹的頂層是“/ home” / mark / test /“那么當前的工作目錄將是”/home/mark/test/.git/“。

在這兩種情況下,都會設置以下環境變量: GIT_DIR設置為“。”

使用工作樹,這出乎意料地尷尬,正如我之前鏈接的Chris Johnsen的回答所述。 如果只設置了GIT_DIR ,則git手冊頁中的此注釋適用:

注意:如果指定了--git-dirGIT_DIR指定--work-tree, GIT_WORK_TREEcore.worktree ,則當前工作目錄將被視為工作樹的頂級目錄。

換句話說,您的工作樹也將是當前目錄(“.git”目錄),這幾乎肯定不是您想要的。

您可以嘗試在鈎子內設置GIT_WORK_TREE=..GIT_WORK_TREE="$GIT_DIR/.."


但文件沒有改變!

最有可能的確如此。 也許只有線性做了,或者在查看差異時忽略了空白變化,但確實發生了變化。 Git知道,因為文件內容的SHA1總和發生了變化。

你在兩端都使用Windows嗎?

Windows傾向於混淆行結尾。 請參閱core.autocrlf和相關選項:

Alex解釋說,解決方案是使用post-receive 您還需要在腳本頂部運行未unset GIT_DIR

在服務器上,我創建了第二個分支並切換到它:

$ git branch
  master
* testing

我的.git/hooks/post-receive現在看起來像這樣:

unset GIT_DIR
cd ..
git merge master

在客戶端我運行git push

您是否嘗試使用post-receive掛鈎? 也許在post-update還沒有完成某些事情,這就是合並無效的原因。

另外我認為你應該嘗試在腳本中包含git reset --hard ,以便git狀態與文件系統同步。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM