搜尋

首頁  >  問答  >  主體

git - 大家都是如何管理伺服器上的檔案的?

網站裡的文件成千上萬,不可能每次改幾十個文件就把整個網站用FTP重新上傳一遍,但每次改了哪些文件,想記住也不是一件簡單的事情,並且這些修改過的檔案分散在許多不同的資料夾裡,一個一個找出來上傳更麻煩。

那麼大家都是如何精確地每次都能很方便地只上傳那些改動過的文件的呢?

PS. 我現在的做法是在本地開發環境上安裝git, 在遠端伺服器上也安裝git,然後這邊push,那邊pull。但還需要telnet或ssh到遠端才能pull,有沒有更自動的方法,這邊push之後,服務端自動就更新了?想聽聽大家的建議。

淡淡烟草味淡淡烟草味2813 天前631

全部回覆(4)我來回復

  • 仅有的幸福

    仅有的幸福2017-05-02 09:29:07

    最簡單的,用git上傳,git自備hooks,可以實現自動部署。
    以前像題主一樣幹過,但多人協作很容易把專案搞亂。

    回覆
    0
  • 世界只因有你

    世界只因有你2017-05-02 09:29:07

    感謝 @Cocbin 的提醒,據此仔細研究了Git的hook原理,然後根據我的專案做了以下事情:

    首先,因為我是把專案部署在github網站上,所以不需要自己設定複雜的hook,只要使用github自備的webhook就可以了。 webhook會在你push到github時激發一個你設定的回呼url,然後你在這個url執行pull操作即可。

    另外,在你的伺服器上,不要使用開發者自己的ssh key來pull,而應該產生一個deploy key,放到github裡面,這個key是不需要手動輸入密碼的,專用於從github pull內容下來,這樣就徹底完成了自動部署。

    我另外還看了Hudson和Jenkins,也都是很不錯的工具,如果是做Java專案的話,應該是使用Jenkins,因為Hudson被Oracle收購之後,逐漸變得不再開放。但因為我的專案是php的,犯不著為了這個再裝一套Java8,所以沒有考慮,但其實也有專門的Jenkins for PHP,但對我來說感覺還是太重了,也許等以後專案再大一些的時候考慮使用吧。

    以上就是一些心得,希望對有同樣問題的同學有幫助。

    ---------- 這裡是華麗麗的分界線 --------------------------

    補充:

    實際操作過程遠比想像中複雜,以下是程式碼:

            $sReqData = file_get_contents('php://input');
            try {
                $payload = json_decode($sReqData);
            } catch (Exception $e) {
                exit(0);
            }
    
            if ($payload->ref === 'refs/heads/master') {
                exec('cd /var/www/your_repo; git pull;');
            }
    

    這時候當有push上傳時,github會回調,但問題是因為回呼時用的是apache這個用戶名,不是你ssh進去時用的那個用戶名,所以你會發現apache這個用戶名對於那個目錄沒有操作權限:
    error: cannot open .git/FETCH_HEAD: Permission denied
    所以你需要先把ssh_user加到apache群組:

    usermod -a -G apache ssh_user

    然後修改權限:

    chmod -R g+w /var/www
    chown -R ssh_user:apache /var/www
    chmod -R g+s /var/www

    之所以放在這個目錄,是因為apache這個使用者的預設目錄就是/var/www,當然你可以把它改到另外一個目錄下,可能會比較安全一些。

    然後:

    sudo -u apache git pull

    它會在apache的.ssh資料夾下產生一個known_hosts文件,然后如果你是用的ssh方式,你还需要把上面生成的deploy key里的两个文件id_rsaid_rsa.pub拷到.ssh資料夾裡去。然後重複多執行幾遍以下命令,確保不再報任何錯誤。然後就可以嘗試從客戶端push一個新版本上去,看看是否可以自動部署成功了。

    ================ 國內版 =====================

    因為Github的伺服器不在國內,所以經常會造成無法push/pull的麻煩,所以考慮遷移到國內的git.oschina.net上。遷移過程不細述。只是有個別地方要注意一下:

    1. 關於webhooks的程式碼:

            $sReqData = $_POST['hook'];
            try {
                $payload = json_decode($sReqData);
                if ($payload->password === '这里是你的密码' && $payload->hook_name === 'push_hooks') {
                    exec('cd /var/www/your_repo; git pull;');
                }
            } catch (Exception $e) {
                exit(0);
            }
    1. 關鍵一步要執行,我被卡在這裡找不到原因很久:

    sudo -u apache git pull

    回覆
    0
  • 習慣沉默

    習慣沉默2017-05-02 09:29:07

    git呀 都知道是版本控制

    回覆
    0
  • 黄舟

    黄舟2017-05-02 09:29:07

    說一下我用過的辦法:
    1、首先你得有一個版本控制服務和rsync服務
    2、從版本伺服器遷出需要部署的穩定版本代碼到一個臨時資料夾
    3、將rsync的服務端目錄指定到暫存資料夾
    4、使用rsync指令將服務端目錄同步到你的部署目錄
    5、寫一個shell:update版本程式碼到暫存資料夾(增量),對暫存資料夾檔案做一些更新操作(如果需要的話),rsync同步臨時資料夾檔案到部署目錄(增量)

    上述流程做完了之後,每次提交程式碼,只需要執行一次上述第5條的shell即可。
    雖然有點麻煩,但比較有效,不喜勿噴。

    回覆
    0
  • 取消回覆