[英]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 stash
, git 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-dir
或GIT_DIR
指定--work-tree,
GIT_WORK_TREE
和core.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.