Git itme kullanarak bir proje dağıtmak

15 Cevap php

O git push kullanarak bir PHP web sitesi dağıtmak mümkün mü? Ben bir git sıfırlama gerçekleştirmek için git kanca kullanarak yapmak için bir şey vardır bir his var - sunucu tarafında sert, ama bunu nasıl gerçekleştirerek hakkında gitmek istiyorsunuz?

15 Cevap

I this script this site bulunan ve oldukça iyi iş gibi görünüyor.

  1. Web sunucusuna. Git dizinini kopyala
  2. Yerel kopya üzerinde, sizin .git / config dosyasını değiştirmek ve bir uzaktan kumanda olarak web sunucusu ekleyin:

    [remote "production"]
        url = username@webserver:/path/to/htdocs/.git
    
  3. Sunucuda, (aşağıda cevap) this file ile .git / kanca / post-güncelleştirmenin yerini

  4. (Sunucuda, tekrar) dosyasına yürütme erişimi ekle:

    chmod +x .git/hooks/post-update
    
  5. Şimdi, sadece yerel web sunucusu itmek ve otomatik çalışma kopyasını güncelleştirmek gerekir:

    git push production
    

post-update dosyası arayanlar tümü için, buraya gidiyor:

#!/bin/sh
#
# This hook does two things:
#
#  1. update the "info" files that allow the list of references to be
#     queries over dumb transports such as http
#
#  2. if this repository looks like it is a non-bare repository, and
#     the checked-out branch is pushed to, then update the working copy.
#     This makes "push" function somewhat similarly to darcs and bzr.
#
# To enable this hook, make this file executable by "chmod +x post-update". 
git-update-server-info 
is_bare=$(git-config --get --bool core.bare) 
if [ -z "$is_bare" ]
then
      # for compatibility's sake, guess
      git_dir_full=$(cd $GIT_DIR; pwd)
      case $git_dir_full in */.git) is_bare=false;; *) is_bare=true;; esac
fi 
update_wc() {
      ref=$1
      echo "Push to checked out branch $ref" >&2
      if [ ! -f $GIT_DIR/logs/HEAD ]
      then
             echo "E:push to non-bare repository requires a HEAD reflog" >&2
             exit 1
      fi
      if (cd $GIT_WORK_TREE; git-diff-files -q --exit-code >/dev/null)
      then
             wc_dirty=0
      else
             echo "W:unstaged changes found in working copy" >&2
             wc_dirty=1
             desc="working copy"
      fi
      if git diff-index --cached HEAD@{1} >/dev/null
      then
             index_dirty=0
      else
             echo "W:uncommitted, staged changes found" >&2
             index_dirty=1
             if [ -n "$desc" ]
             then
                   desc="$desc and index"
             else
                   desc="index"
             fi
      fi
      if [ "$wc_dirty" -ne 0 -o "$index_dirty" -ne 0 ]
      then
             new=$(git rev-parse HEAD)
             echo "W:stashing dirty $desc - see git-stash(1)" >&2
             ( trap 'echo trapped $$; git symbolic-ref HEAD "'"$ref"'"' 2 3 13 15 ERR EXIT
             git-update-ref --no-deref HEAD HEAD@{1}
             cd $GIT_WORK_TREE
             git stash save "dirty $desc before update to $new";
             git-symbolic-ref HEAD "$ref"
             )
      fi 
      # eye candy - show the WC updates :)
      echo "Updating working copy" >&2
      (cd $GIT_WORK_TREE
      git-diff-index -R --name-status HEAD >&2
      git-reset --hard HEAD)
} 
if [ "$is_bare" = "false" ]
then
      active_branch=`git-symbolic-ref HEAD`
      export GIT_DIR=$(cd $GIT_DIR; pwd)
      GIT_WORK_TREE=${GIT_WORK_TREE-..}
      for ref
      do
             if [ "$ref" = "$active_branch" ]
             then
                   update_wc $ref
             fi
      done
fi

Alternatif olarak, Google'ın önbellek de bulabilirsiniz:

http://webcache.googleusercontent.com/search?q=cache:yNTUFsYBYFMJ:utsl.gen.nz/git/post-update+http://utsl.gen.nz/git/post-update&cd=1&hl=en&ct=clnk&gl=ie

Çok yanlış başlar ve ölü sona erdikten sonra, nihayet sadece ile web kod dağıtmak mümkün değilim "git push remote" sayesinde this article.

The author's post-update script is only one line long and his solution doesn't require .htaccess configuration to hide the Git repo as some others do.

Bir Amazon EC2 örneği bu dağıtma eğer blok tökezleyerek bir çift;

Eğer çıplak hedef deposunu oluşturmak için sudo kullanırsanız 1), sen ec2-kullanıcıya repo sahibini değiştirmek için veya itme başarısız olacaktır vardır. ("Chown ec2-kullanıcı.: Ec2 kullanıcı repo" Dene)

2) itme sizin amazon-private-key. PEM yerini önceden konfigüre yoksa başarısız bir IdentityFile parametre olarak veya ~ / .ssh / config / etc / ssh / ssh_config kullanarak ya olacak "[Ana] - AnaBilgisayarAdı - IdentityFile - Kullanıcı" düzeni tarif here ...

Ana HostName daha ~ / .ssh / config ve farklı yapılandırılmış ise ... ANCAK Git itme başarısız olur. (Muhtemelen bir Git böcek)

Bir sunucu üzerinde budala yüklemek Yüklü ya da orada. git klasörünü kopyalayın. komutunu aşağıdaki kullanabileceğiniz bir git klon bir sunucuyu güncelleştirmek için:

git ls-files -z | rsync --files-from - --copy-links -av0 . user@server.com:/var/www/project

Eğer proje kaldırılır var dosyaları silmek zorunda kalabilirsiniz.

Bu kopyalar tüm dosyaları kontrol etti. rsync zaten bir sunucuda yüklü ssh kullanır.

Eğer bir sunucu üzerinde yüklü az yazılım daha güvenli o ve o kadar kolay bu yapılandırma yönetmek ve belgelemek. sunucu üzerinde tam bir git klon tutmak gerek de yoktur. sadece her şeyi düzgün sabitlemek için daha karmaşık hale getirir.

Aslında yapmanız gereken tüm aşağıdaki gibidir:

server = $1
branch = $2
git push $server $branch
ssh <username>@$server "cd /path/to/www; git pull"

I deploy adlı bir yürütülebilir dosya olarak benim uygulamada bu hatları var.

Ben bir dağıtma yapmak istediğinizde bu yüzden ben yazın ./deploy myserver mybranch.

Bunu yolu ben değişiklikleri itmek benim dağıtım sunucusuna çıplak Git depo olması. Sonra, dağıtım sunucusunda oturum gerçek web sunucusu docs dizini değiştirin ve git çekme yapın. Ben otomatik olarak yapmak için denemek için herhangi bir kanca kullanmayın, bu değer daha fazla sorun gibi görünüyor.

Güncelleme: Ben şimdi anahtar madde ile Lloyd Moore çözüm kullanıyorum ssh -A .... Bir ana repo için bastırıyor ve sonra tüm makineleri paralel ondan çekerek biraz daha hızlı ve bu makineler daha az kurulum gerektirir.


Burada bu çözümü göremiyorum. git sunucuda yüklü değilse, sadece ssh ile itin.

Eğer yerel .git / config aşağıdaki girdiyi gerekir

[remote "amazon"]
    url = amazon:/path/to/project.git
    fetch = +refs/heads/*:refs/remotes/amazon/*

Ama hey, nedir ile bu amazon:? Yerel ~ / .ssh / config aşağıdaki girdiyi eklemeniz gerekir:

Host amazon
    Hostname <YOUR_IP>
    User <USER>
    IdentityFile ~/.ssh/amazon-private-key

şimdi arayabilirsiniz

git push amazon master
ssh <USER>@<YOUR_IP> 'cd /path/to/project && git pull'

(BTW: / / yol / project.git fiili çalışma dizin / yol / / proje için farklıdır)

We use capistrano for managing deploy. We build capistrano to deploy on a staging server, and then running a rsync with all of ours server.

cap deploy
cap deploy:start_rsync (when the staging is ok)

Capistrano ile, hata durumunda kolay geri alma yapılmış olabilir

cap deploy:rollback
cap deploy:start_rsync

Eğer sunucu üzerinde iki kopyalarını olmalıdır gibi geliyor. Bir çıplak kopyalama, sen bittiğinde sizin yaptığınız değişiklikleri itmek hangi gelen itme / çekme, ve olabilir o zaman size web dizini içine bu klonlanması ve her gün veya web dizini git çekme güncellemek için bir cronjob kurarsınız böylece.

Giddyup git push aracılığıyla dağıtılmasını otomatik olarak dil agnostik just-add-water git kancalar vardır. Ayrıca özel vb önbellek ısınıyor, web sunucusu yeniden başlatmak için / stop kanca başlatmak olmasına izin verir

https://github.com/mpalmer/giddyup

Çıkış examples.

https://github.com/jesalg/SlimJim - - Ben otomatik repo yeni güncelleştirmeleri aşağı çekeceği kendi ilkel dağıtım aracını oluşturarak sona erdi Temelde github post-almak-kanca dinler ve bir güncelleştirme komut dosyası tetiklemek için bir proxy kullanır.

Sen makul bir git kanca kurmak olabilir zaman bir taahhüt o değişiklikleri çekin ve PHP sitesinde bunları uygulamak olacak "kararlı" şube söylemek için yapılır söylüyorlar. Ama bilmeniz istikrarlı şubesinin içine gövde şube söylemek birleştirme ne iş ne kadar dahil olacak bir fikir edinebilirsiniz - büyük olumsuz şeyler yanlış gider ve bu test için zaman katacak eğer çok kontrole sahip olmayacaksınız Eğer may çalıştırmak kaç çatışmalar. Eğer sadece tek bir site çalıştırmak niyetinde sürece site belirli (örneğin konfigürasyon dosyaları) herhangi bir dosya üzerinde bir göz tutmak için önemli olacaktır.

Alternatif yerine siteye değişiklik iterek içine baktım?

Git kanca hakkında bilgi için githooks belgelerine bakın.

Eğer aşağıdaki yönergeleri yardımcı olabilir aynı arşive erişen birden geliştiriciler var bir ortam göz önüne alındığında.

Tüm Devs ait ve bu gruba. Git depo sahipliği vermek bir unix grubu var olduğundan emin olun.

  1. Sunucu depo set sharedrepository arasında .git / config = true. (Bu kaydedilmesini ve dağıtım için gerekli olan çoklu kullanıcılara izin için git söyler.

  2. aynı olmak onların Bashrc dosyalarında her kullanıcının umask ayarlamak - 002 iyi bir başlangıç

Benim Christians çözüm almak.

git archive --prefix=deploy/  master | tar -x -C $TMPDIR | rsync $TMPDIR/deploy/ --copy-links -av username@server.com:/home/user/my_app && rm -rf $TMPDIR/deploy
  • Tar içine Arşivler ana dal
  • Ayıklar sistemi geçici klasörde dağıtmak dir içine arşiv tar.
  • sunucuya rsync değişiklikler
  • temp klasöründen dağıtmak dir silin.

Ben basit bir kanca komut dosyası olan, toroid.org tarafından aşağıdaki çözüm kullanıyorum.

sunucuda:

$ mkdir website.git && cd website.git
$ git init --bare
Initialized empty Git repository in /home/ams/website.git/

and install the hook sunucuda:

$ mkdir /var/www/www.example.org
$ cat > hooks/post-receive
#!/bin/sh
GIT_WORK_TREE=/var/www/www.example.org git checkout -f

$ chmod +x hooks/post-receive

istemci üzerinde:

$ mkdir website && cd website
$ git init
Initialized empty Git repository in /home/ams/website/.git/
$ echo 'Hello, world!' > index.html
$ git add index.html
$ git commit -q -m "The humble beginnings of my web site."

$ git remote add web ssh://server.example.org/home/ams/website.git
$ git push web +master:refs/heads/master

sonra sadece yazın yayımlamak

$ git push web

Web sitesinde tam bir açıklaması vardır: http://toroid.org/ams/git-website-howto