2009-10-12 43 views
5

我使用Git錯誤。我想正確使用它。推送Git源代碼樹,而不僅僅是一個存儲庫

下面是我得到了什麼:

在這裏,我的機器上一個Git倉庫,我承諾與測試。

在那裏,是我的網絡服務器 - 這個代碼將被部署的一個地方。當我準備部署時,Web服務器還有另一個純粹的git存儲庫,我可以通過SSH將它推送到該存儲庫。

我想要發生的是有一個視圖到總是有最新版本的源文件(在某些分支或一些標籤)的Git存儲庫。

我可以做的是在網絡服務器上創建另一個(非裸)git存儲庫,並在每次推送後進行手動拉取,但我希望避免每次都登錄到Web服務器當我做一個git推。

如果我保證沒有編輯Web服務器上的任何文件,是否有遠程「推送到Web服務器並刷新其簽出的文件」的方法?

或者我只是做錯了你想拍我? :-)

回答

7

我通常創建一個文件git的非純倉庫/掛鉤/後收到一封包含

#!/bin/sh 
cd .. 
env -i git reset --hard 

該文件必須是可執行的,並且必須檢出分支。

然後每次您推送到該存儲庫時,工作樹將重置爲當前分支的最新版本。 任何本地更改都將被覆蓋(但未跟蹤的文件不會被刪除)。

Git現在在推送到簽出分支時會顯示警告(並在將來的版本中拒絕)。 爲了避免這種情況,你可以在遠程倉庫設置此配置:

git config receive.denyCurrentBranch ignore 

你可以在這個倉庫的工作,但在此之前任何推做是爲了它,你必須提交更改。

我發現有尖:http://debuggable.com/posts/git-tip-auto-update-working-tree-via-post-receive-hook:49551efe-6414-4e86-aec6-544f4834cda3

7

hooks可能是你要找的。

您創建了一個post-receive鉤子。它會在你每做一次推動之後在服務器上執行。 然後你做第二裸倉庫拉你永遠是最新的:)

1

我使用這樣的事情裸存儲庫(用戶帳戶內)和共享存儲庫,其是網絡的根。
裸存儲庫具有更新後的掛鉤來提取web根目錄,因此在推送到存儲庫後,web根目錄將被拖動。

要從網絡服務器讀取/寫入訪問權限,我的git-user也在www-data組中,網絡根目錄是chmod ug + rwx,g + s,所以新創建的文件將獲得組。umask確保該組具有讀/寫訪問權限,因爲Git使用通常爲0022的默認umask(文檔中提到了在配置中使用自己的umask,但這從來沒有用於我)

#!/bin/bash 
# post-update hook 

WEB_DIR="/var/www/myweb" 
pushd $WEB_DIR > /dev/null 
export GIT_DIR="$WEB_DIR/.git" 
umask 0007 
git pull 
popd > /dev/null 
相關問題