簡體   English   中英

Git:從存儲庫自動拉取?

[英]Git: auto pull from repository?

有什么方法可以設置 git 以便它監聽來自遠程倉庫的更新並在發生變化時拉取? The use case is I want to deploy a web app using git (so I get version control of the deployed application) but want to put the "central" git repo on Github rather than on the web server (Github's interface is just soooo nice) .

有沒有人得到這個工作? Heroku 是如何做到的? 我的 Google-fu 沒有給我任何相關的結果。

Git 有“鈎子”,可以在其他動作之后執行的動作。 您似乎正在尋找的是“接收后掛鈎”。 在 github 管理員中,您可以設置一個 post-receive url,每當有人推送到您的 repo 時,該 url 都會被命中(帶有包含有關剛剛推送的內容的數據的有效負載)。

就其價值而言,我認為自動拉取不是一個好主意 - 如果將錯誤推送到您的分支怎么辦? 我會使用像capistrano (或類似的)這樣的工具來處理這些事情。

在類 Unix 上,您可以在您的機器上創建調用“git pull”(每天或每周或其他)的 cron 作業。 在 Windows 上,您可以使用任務調度程序或“AT”命令來做同樣的事情。

有像 Jenkins 或 Bamboo 這樣的持續集成程序,它們可以檢測提交並觸發構建、測試、打包和部署等操作。 他們做你想做的事,但他們有很多依賴,難以配置,最后他們可能會定期檢查 git 存儲庫,這與每分鍾通過 cron 調用 git pull 具有相同的效果。

您可以通過執行以下操作來編寫腳本來實現此目的:

  1. 獲取遠程HEAD提交ID
  2. 將ID與本地HEAD進行比較
  3. 如果它們不同,請使用git pull並使用deploy命令
  4. 如果相同,則通過
  5. 編寫cron作業以執行腳本(注意:防止重復執行。)

我知道這個問題有點舊,但是您可以使用 Windows 日志和 git 使用 webhook 和 php 自動拉取您的項目(假設您的項目涉及網絡服務器。請在此處查看我的要點: https : //gist.github.com/ upggr/a6d92e2808e9628ebe0d01fd93569f4a

正如一些人在嘗試后注意到的那樣,如果您使用 php exec() ,結果證明解決權限並不那么簡單。

將執行命令的用戶可能不是您自己的用戶,而是www-dataapache

如果您有 root/sudo 訪問權限,我建議您閱讀這篇Jonathan 的博客文章

當您不被允許/無法解決權限時

我的解決方案有點創意。 我注意到我可以在我的用戶名下創建一個帶有循環的腳本,並且 git pull 可以正常工作。 但是,正如其他人所指出的那樣,會帶來每隔 60 秒運行大量無用git pull的問題。

所以這里是使用webhooks的更精細解決方案的步驟:

  • 部署密鑰:轉到您的服務器並鍵入: ssh-keygen -t rsa -b 4096 -C "deploy"以生成新的部署密鑰,不需要寫權限(只讀更安全)。 將公鑰復制到您的 github 存儲庫設置中的“部署密鑰”下。
  • Webhook :轉到您的存儲庫設置並創建一個 Webhook。 讓我們假設有效負載地址是http://example.com/gitpull.php
  • 有效負載:創建一個包含以下代碼示例的 php 文件。 負載的目的不是git pull而是警告以下腳本需要pull 這里是簡單的代碼:

gitpull.php :

<?php

/* Deploy (C) by DrBeco 2021-06-08 */

echo("<br />\n");
chdir('/home/user/www/example.com/repository'); 
touch(GITPULLMASTER);
?>
  • 腳本:在您的首選文件夾中創建一個腳本,例如/home/user/gitpull.sh使用以下代碼:

gitpull.sh

#!/bin/bash

cd /home/user/www/example.com/repository
while true ; do
      if [[ -f GITPULLMASTER ]] ; then
            git pull > gitpull.log 2>&1
            mv GITPULLMASTER GITPULLMASTER.`date +"%Y%m%d%H%M%S"`
      fi
      sleep 10
done
  • 分離:最后一步是在分離模式下運行腳本,這樣您就可以注銷並保持腳本在后台運行。

有兩種方法可以做到這一點,第一種更簡單,不需要安裝screen software

  • 否認

    • 運行./gitpull.sh &將其置於后台
    • 然后鍵入disown -h %1以分離,您可以注銷
  • 屏幕

    • 運行screen
    • 運行./gitpull.sh
    • 鍵入control+ad以分離,您可以注銷

結論

這個解決方案很簡單,您可以避免弄亂密鑰、密碼、權限、sudo、root 等,還可以防止腳本用無用的git pull s 淹沒您的服務器。

它的工作方式是檢查文件GITPULLMASTER存在; 如果沒有,就回去睡覺。 僅當它存在時,才執行git pull

您可以更改行:

mv GITPULLMASTER GITPULLMASTER. 日期 +"%Y%m%d%H%M%S"`

rm GITPULLMASTER

如果您更喜歡更干凈的目錄。 但我發現讓拉取日期注冊(和未跟蹤)對調試很有用。

對於我們的本地 Windows 測試服務器,我們使用 Windows 任務計划程序任務,設置為每 3 分鍾運行一次,從 Bitbucket 雲拉到這些服務器上的存儲庫。 雖然不是即時的,但它滿足了我們的需求,並且已被證明是可靠的。

暫無
暫無

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

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