2009-09-16 101 views
7

我想使用git來管理遠程服務器上的一些數據,所以我在那裏建立了一個非裸露的存儲庫。我可以毫無問題地推送它,並且存儲庫本身會更新,但實際文件不會被更改/添加/刪除。我必須ssh進入服務器,並執行Git:如何在推送到遠程目錄時進行更新?

git reset --hard HEAD 

獲取文件結構以實際更新。

要做什麼?

回答

7

你不應該這樣做。建議使用裸存儲庫。換句話說,沒有文件檢出,只是.git目錄本身。然後,您可以將存儲庫檢出到服務器上的其他位置 - 比如說您的web根目錄。這樣,您將得到:

  • git best practice。根據Git文檔,如果你不遵守它,你可能會得到「意想不到的結果」。任何編程完成的人都知道,「意想不到的結果」是代碼「可能會吃掉你的孩子,應該不惜一切代價避免。」

  • 更好的安全性,如果你打算讓服務器上的檢出文件可以從網絡服務器訪問。

  • 對簽出的代碼進行本地修改,並且能夠快速更改實時簽出的代碼。您可以嘗試直接在存儲庫上執行此操作,但這會很麻煩並且更容易出錯。

  • 能夠更新您的服務器存儲庫,而不必更新您的實時服務代碼。這非常重要,如果您正在遠程工作並需要向服務器發送某些內容,然後在準備好實時服務之前做進一步工作,或者如果您的實時服務代碼發生更改(例如,不同的配置設置),並且需要將這些更改與回購中的更改合併在一起,但現在不能這樣做。

我建議以下步驟:

  • 按照從您的回購建立一個純倉庫
  • 退房碼到您的Live服務的目標目錄
  • 設置git的文檔一個git鉤子(post-commit應該是正確的一個IIRC)在存儲庫更新時更新您的實時服務。它應該可以cd到實時服務目錄,並做一個git pull --rebase,並可能設置一些文件權限。
  • 從現在開始,只需將您的代碼從開發箱中推送到回購站。
+0

非常有用的答案。謝謝! – Felixyz 2009-09-21 20:48:24

+0

但至少對於各種非生產設置,請參閱Brandon Rhodes的答案。 – Felixyz 2016-11-19 18:35:30

3

使用更新後鉤:

hooks

在那裏,你可以執行任何你想在每次更新。

+0

我的想法確切。 – 2009-09-16 16:06:57

+0

謝謝。我曾希望有一個簡單的設置來實現這一點。但鉤子看起來也很簡單。 – Felixyz 2009-09-16 16:54:13

1

Git版本1.9.1
Ubuntu服務器14。04 LTS
LAMP服務器

設置我的LAMP服務器來更新我的Git回購我的工作目錄,每當我的web開發一個推更改了服務器。我注意到日誌會記錄新的提交,但不會更新工作目錄。對於每次更新,不要手動執行此操作(git checkout -f),可以在接收到推送後自動設置。

  1. 在「.git」目錄中,進入「鉤子」文件夾。接收來自遠程客戶端推後

    #/ bin/sh的

    #更新工作目錄:

  2. 與此內容的「掛鉤」文件夾中創建一個名爲「後收到」文件!
    #這應該針對git工作目錄。

    GIT_WORK_TREE = /無功/網絡/ dev_site GIT中結帳-f

  3. 啓用權限通過鍵入在 「掛鉤」 文件夾 「使用chmod + X後接收」 來執行該文件。

當提交到Git倉庫時,它將會更新工作目錄。我的網站現在顯示當我在瀏覽器中訪問它時所做的更改。

我的工作目錄是/ var/WWW/dev_site

+0

GIT_WORK_TREE行應該指向你的工作目錄。 – 2015-01-28 00:02:43

+0

這是一個定期回購,而不是一個裸回購。裸露的回購沒有工作目錄。 – 2015-01-28 00:25:07

3

這令人高興的是,現在直接支持Git的本身!你可以找到這個答案的細節,我剛纔upvoted:

https://stackoverflow.com/a/38363683/85360

它建議遠程與

git config receive.denyCurrentBranch updateInstead 

配置這樣是推動導致更新的工作副本!

+1

太好了,謝謝!我非常感謝SO如何讓我跟蹤我曾經問過的事情。我認爲接受答案中的許多要點仍然有效(也許並不是「檢出代碼的實時更改」),但對於許多情況下可能不是「生產使用」的情況,這非常有用。 – Felixyz 2016-11-19 18:34:45