Menyebarkan proyek menggunakan Git push

412

Apakah mungkin untuk menggunakan situs web menggunakan git push? Saya punya firasat itu ada hubungannya dengan menggunakan kait git untuk melakukan git reset --harddi sisi server, tapi bagaimana saya bisa menyelesaikan ini?

Kyle Cronin
sumber
2
Saya kira ini hanya akan berlaku dalam situasi di mana hanya ada satu server produksi, kan?
Rijk
6
@Rijk Baiklah, Anda dapat mendorong ke beberapa server secara bersamaan dengan Git, tetapi begitu Anda naik ke tingkat itu Anda mungkin menginginkan solusi aktual, bukan peretasan seperti ini.
Kyle Cronin
Saya telah sukses menggunakan capistrano dengan proyek-proyek saya, yang walaupun awalnya dirancang untuk penyebaran aplikasi Ruby on Rails, bekerja dengan baik dengan PHP dan proyek lainnya.
Diterjemahkan jawabannya ke dalam bahasa Rusia di ru.so: ru.stackoverflow.com/questions/428483/…
Nick Volynkin

Jawaban:

287

Saya menemukan script ini di situs ini dan tampaknya bekerja cukup baik.

  1. Salin direktori git Anda ke server web Anda
  2. Pada salinan lokal Anda, modifikasi file .git / config Anda dan tambahkan server web Anda sebagai remote:

    [remote "production"]
        url = username@webserver:/path/to/htdocs/.git
    
  3. Di server, ganti .git / hooks / post-update dengan file ini (dalam jawaban di bawah)

  4. Tambahkan akses eksekusi ke file (sekali lagi, di server):

    chmod +x .git/hooks/post-update
    
  5. Sekarang, cukup tekan secara lokal ke server web Anda dan itu akan secara otomatis memperbarui copy pekerjaan:

    git push production
    
Kyle Cronin
sumber
128
Pastikan Anda memiliki kebijakan .htaccess yang melindungi direktori .git agar tidak dibaca. Seseorang yang merasa seperti URL diving dapat memiliki hari lapangan dengan seluruh kode sumber jika dapat diakses.
Jeff Ferland
39
Atau cukup buat direktori publik sebagai subdirektori dari git repo. Maka Anda dapat memiliki file pribadi yang Anda yakin tidak akan dipublikasikan.
tlrobinson
3
tautan ini sudah mati. apakah ada tautan lain ke file pasca pembaruan?
Robert Hurst
6
Mungkin saya kehilangan sesuatu tetapi Anda tidak ingin server produksi Anda menarik dari cabang produksi repositori master git. Saya kira OP hanya memiliki satu server? Saya biasanya membuat server integrasi berkelanjutan saya melakukan penyebaran situs saya (menjalankan beberapa tes sebelum digunakan).
Adam Gent
4
Mengikuti langkah-langkah dari repositori yang sudah memiliki urutan komit; pada awalnya Anda tidak bisa mendorong karena cabang master sudah diperiksa. Kemudian jika Anda checkout cabang alternatif pada remote hanya file yang berbeda diperiksa ke direktori kerja. Saya berharap kait untuk melakukan reset --hard for me
barrymac
80

Menggunakan file pasca pembaruan di bawah ini:

  1. Salin direktori git Anda ke server web Anda
  2. Pada salinan lokal Anda, modifikasi file .git / config Anda dan tambahkan server web Anda sebagai remote:

    [remote "production"]
        url = username@webserver:/path/to/htdocs/.git
    
  3. Di server, ganti .git / hooks / post-update dengan file di bawah ini

  4. Tambahkan akses eksekusi ke file (sekali lagi, di server):

    chmod +x .git/hooks/post-update
    
  5. Sekarang, cukup tekan secara lokal ke server web Anda dan itu akan secara otomatis memperbarui copy pekerjaan:

    git push production
    
#!/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
Darío Javier Cravero
sumber
5
Ya ampun ... tulis saja skrip ini pada bahasa yang Anda gunakan untuk pengembangan, apakah itu php, python, groovy atau apa pun! Saya tidak pernah mengerti cinta ini untuk skrip shell yang memiliki (secara subyektif) sintaks yang cukup aneh dan fitur fungsional yang sangat sedikit.
dVaffection
4
@dVaffection dalam hal apa pun Anda akan menulis perintah shell jika Anda menggunakan git. jadi alih-alih menulis skrip dalam bahasa lain dan terus-menerus menyulap antara bahasa itu dan shell. menulis semuanya dalam shell tampaknya logis bukan?
Abderrahmane TAHRI JOUTI
saya harus melakukan 'git config accept.denyCurrentBranch updateInstead' di server juga, sehingga akan menerima dorongan. Saya pikir ini karena cabang sudah diperiksa?
stackPusher
60

Setelah banyak kesalahan awal dan jalan buntu, saya akhirnya dapat menggunakan kode situs web hanya dengan "git push remote " berkat artikel ini .

Script post-update penulis hanya sepanjang satu baris dan solusinya tidak memerlukan konfigurasi .htaccess untuk menyembunyikan repo Git seperti yang dilakukan beberapa orang lain.

Beberapa batu sandungan jika Anda menggunakan ini pada instance Amazon EC2;

1) Jika Anda menggunakan sudo untuk membuat repositori tujuan kosong, Anda harus mengubah pemilik repo ke pengguna ec2 atau push akan gagal. (Coba "chown ec2-user: repo -user ec2 .")

2) Dorongan akan gagal jika Anda tidak melakukan pra-konfigurasi lokasi amazon-private-key .pem Anda, baik di / etc / ssh / ssh_config sebagai parameter IdentityFile atau di ~ / .ssh / config menggunakan "[ Host] - HostName - IdentityFile - User "layout dijelaskan di sini ...

... NAMUN jika Host dikonfigurasi dalam ~ / .ssh / config dan berbeda dari HostName, push Git akan gagal. (Itu mungkin bug Git)

Earl Zedd
sumber
Saya mengikuti langkah-langkah dalam artikel yang Anda sebutkan, dan semuanya bekerja seperti pesona. Saya hanya ingin tahu apakah ada beberapa kelemahan terkait keamanan atau stabilitas. Ada saran tentang ini?
xlttj
xl-t: Anggap saja Anda menggunakan Git daripada SSH Saya akan mengatakan bahayanya terletak pada membuat kesalahan dengan Git. Anda bisa bertanya kepada penulis artikel; dia mengakhirinya dengan "Pertanyaan dan saran dipersilahkan." Strategi replikasi saya saat ini (mati otak) adalah menggunakan Transmit oleh Panic Software.
Earl Zedd
1
Artikel yang ditautkan memiliki satu persyaratan penting ketika Anda menggunakan kait. Kait akan gagal jika .git berada dalam skema penamaan yang sama dengan direktori kerja. yaitu / foo / bar (direktori kerja) dan /foo/bar.git (repositori barebone git). Jadi pastikan Anda mengganti nama / foo / bar ke sesuatu yang lain, seperti /foo/bar.live atau / foo / blah Nah, jika Anda bertanya-tanya, pesan kesalahan yang tepat akan Anda terima jika direktori kerja Anda memiliki nama yang sama dengan repositori barebone adalah "remote: fatal: Tidak dapat melompat kembali ke cwd asli: Tidak ada file atau direktori seperti itu"
Antony
1
Saya tidak mengikuti mengapa Anda membutuhkan pengait post-deploy untuk menjalankan. Mendorong perubahan kode ke repo jarak jauh berarti repo jarak jauh up to date. Apa yang saya lewatkan?
Charlie Schliesser
1
@CharlieS apa yang Anda lewatkan adalah git tidak akan membiarkan Anda mendorong cabang ke repositori yang telah diperiksa cabang tersebut. Dalam hal ini, jawaban (IMHO sangat baik) adalah memiliki dua repositori: repo kosong yang Anda dorong ke dan repo kedua yang direktori kerjanya diperbarui melalui hook ketika repo telanjang didorong ke.
Ben Hughes
21

jangan menginstal git di server atau menyalin folder .git di sana. untuk memperbarui server dari klon git, Anda dapat menggunakan perintah berikut:

git ls-files -z | rsync --files-from - --copy-links -av0 . [email protected]:/var/www/project

Anda mungkin harus menghapus file yang dihapus dari proyek.

ini menyalin semua file yang diperiksa. rsync menggunakan ssh yang diinstal pada server.

semakin sedikit perangkat lunak yang Anda instal di server, semakin aman dia dan semakin mudah mengelola konfigurasi dan mendokumentasikannya. juga tidak perlu menyimpan klon git lengkap di server. itu hanya membuatnya lebih kompleks untuk mengamankan semuanya dengan benar.

Kristen
sumber
3
Satu peringatan: itu akan rsync file yang Anda miliki di direktori kerja Anda. Saya pikir itu bisa dihindari dengan menggunakan skrip yang menyimpan perubahan saat ini, membersihkan semuanya, menyebarkan dan kemudian mengembalikan simpanan.
mateusz.fiolka
Servernya laki-laki?
Ian Warburton
12

Intinya semua yang perlu Anda lakukan adalah sebagai berikut:

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

Saya memiliki garis-garis dalam aplikasi saya sebagai executable yang dipanggil deploy.

jadi ketika saya ingin melakukan penyebaran saya ketik ./deploy myserver mybranch.

Lloyd Moore
sumber
lihat jawaban saya bagaimana menyelesaikan masalah jika Anda memerlukan kunci pribadi atau nama pengguna yang berbeda untuk ssh
Karussell
Solusi ini lebih cepat daripada milik saya saat digunakan ke beberapa server! Cukup dorong ke repo utama dan tarik sejajar dengannya. Dan jika Anda tidak ingin atau tidak bisa menggunakan kunci Anda untuk setiap contoh gunakan agen kunci! ssh -A ...
Karussell
1
Akan lebih mudah jika Anda menyertakan panduan tentang pengaturan kunci SSH yang bergantung pada jawaban ini untuk berfungsi 'mulus'
Hengjie
Penggunaan git pullharus dihindari untuk penyebaran otomatis karena bagian gabungan dari itu bisa memerlukan pembersihan manual jika ada konflik.
Quinn Comendant
9

Cara saya melakukannya adalah saya memiliki repositori telanjang Git di server penempatan tempat saya mendorong perubahan. Kemudian saya masuk ke server penyebaran, mengubah ke direktori server web server yang sebenarnya, dan melakukan git pull. Saya tidak menggunakan pengait untuk mencoba melakukan ini secara otomatis, sepertinya lebih banyak masalah daripada nilainya.

Greg Hewgill
sumber
Jika terjadi kesalahan pada kode baru, apakah Anda mengatur ulang per komit atau seluruh tarikan? (Atau hanya 1 yang mungkin?)
Rudie
1
@Rudie: Jika Anda perlu mengembalikan perubahan pada server penempatan, maka Anda dapat menggunakan git resetuntuk mundur di antara perubahan terbaru (semua melakukan, bukan hanya seluruh tarikan). Jika Anda perlu memutar kembali sesuatu yang spesifik yang bukan komit terbaru, maka Anda dapat menggunakan git reverttetapi itu mungkin harus digunakan hanya dalam keadaan darurat ( git revertmembuat komit baru yang menghilangkan efek dari beberapa komit sebelumnya).
Greg Hewgill
Hanya karena penasaran: mengapa menurut Anda kait akan lebih merepotkan daripada nilainya untuk ini?
Rijk
@ Rijk: Saat menggunakan kait untuk ini, direktori dokumen server web aktual diubah oleh proses latar belakang otomatis. Masuk memungkinkan saya memiliki kendali lebih besar atas kapan tepatnya perubahan diterapkan pada direktori dokumen. Juga, lebih mudah untuk memperbaikinya ketika ada kesalahan. Kait mungkin lebih tepat jika pengendara tidak memiliki akses yang cukup untuk masuk ke server web.
Greg Hewgill
Jadi folder webapp Anda yang sebenarnya juga merupakan repositori .git? Bagaimana dengan folder .git, itu terlihat oleh dunia luar?
Fernando
9

git config --local receive.denyCurrentBranch updateInstead

Ditambahkan di Git 2.3, ini bisa menjadi kemungkinan yang baik: https://github.com/git/git/blob/v2.3.0/Documentation/config.txt#L2155

Anda mengaturnya di repositori server, dan itu juga memperbarui pohon kerja jika itu bersih.

Ada perbaikan lebih lanjut dalam 2.4 dengan push-to-checkoutpengait dan penanganan cabang yang belum lahir .

Penggunaan sampel:

git init server
cd server
touch a
git add .
git commit -m 0
git config --local receive.denyCurrentBranch updateInstead

cd ..
git clone server local
cd local
touch b
git add .
git commit -m 1
git push origin master:master

cd ../server
ls

Keluaran:

a
b

Ini memang memiliki kekurangan berikut yang disebutkan pada pengumuman GitHub :

  • Server Anda akan berisi direktori .git yang berisi seluruh riwayat proyek Anda. Anda mungkin ingin membuat ekstra yakin bahwa itu tidak dapat disajikan kepada pengguna!
  • Selama penyebaran, akan mungkin bagi pengguna untuk sesaat menemukan situs dalam keadaan tidak konsisten, dengan beberapa file di versi lama dan yang lain di versi baru, atau bahkan file setengah tertulis. Jika ini merupakan masalah bagi proyek Anda, push-to-deploy mungkin bukan untuk Anda.
  • Jika proyek Anda memerlukan langkah "build", maka Anda harus mengaturnya secara eksplisit, mungkin melalui githooks.

Tetapi semua poin tersebut berada di luar lingkup Git dan harus diurus dengan kode eksternal. Jadi dalam hal ini, ini, bersama dengan kait Git, adalah solusi utama.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
sumber
Untuk mengaturnya, jalankan perintah ini: 'git config accept.denyCurrentBranch updateInstead' di terminal
stackPusher
5

Pembaruan: Saya sekarang menggunakan solusi Lloyd Moore dengan agen utama ssh -A .... Mendorong ke repo utama dan kemudian menariknya secara paralel dari semua mesin Anda sedikit lebih cepat dan membutuhkan lebih sedikit pengaturan pada mesin-mesin itu.


Tidak melihat solusi ini di sini. tekan saja ssh jika git diinstal di server.

Anda memerlukan entri berikut di .git / config lokal Anda

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

Tapi hei, ada apa dengan itu amazon:? Di ~ / .ssh / config lokal Anda, Anda harus menambahkan entri berikut:

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

sekarang kamu bisa menelepon

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

(BTW: /path/to/project.git berbeda dengan direktori / jalur / ke / proyek kerja aktual)

Karussell
sumber
5

Untuk Skenario Penempatan

Dalam skenario kami, kami menyimpan kode di github / bitbucket dan ingin menggunakan server langsung. Dalam hal ini, kombinasi berikut berfungsi untuk kami (yang merupakan remix dari jawaban yang sangat dipilih di sini) :

  1. Salin .gitdirektori Anda ke server web Anda
  2. Di salinan lokal Anda git remote add live ssh://user@host:port/folder
  3. Pada jarak jauh: git config receive.denyCurrentBranch ignore
  4. Pada jarak jauh: nano .git/hooks/post-receivedan tambahkan konten ini:

    #!/bin/sh GIT_WORK_TREE=/var/www/vhosts/example.org git checkout -f

  5. Pada jarak jauh: chmod +x .git/hooks/post-receive

  6. Sekarang Anda bisa mendorong ke sana dengan git push live

Catatan

  • Solusi ini bekerja dengan versi git yang lebih lama (diuji dengan 1.7 dan 1.9)
  • Anda harus memastikan mendorong ke github / bitbucket terlebih dahulu, sehingga Anda akan memiliki repo yang konsisten di live
  • Jika .gitfolder Anda di dalam root dokumen pastikan Anda menyembunyikannya dari luar dengan menambahkan .htaccess( sumber ):

    RedirectMatch 404 /\..*$

Attila Fulop
sumber
4

Kami menggunakan capistrano untuk mengelola penyebaran. Kami membangun capistrano untuk digunakan pada server pementasan, dan kemudian menjalankan rsync dengan semua server kami.

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

Dengan capistrano, kita dapat membuat rollback mudah jika terjadi bug

cap deploy:rollback
cap deploy:start_rsync
Supernini
sumber
sudahkah Anda mengintegrasikan penyebaran langsung melalui rsync ke dalam capistrano?
Martin Abraham
2

Giddyup adalah bahasa-agnostik hanya-tambahkan-air kait git untuk mengotomatiskan penyebaran melalui dorongan git. Hal ini juga memungkinkan Anda untuk memiliki kait start / stop kustom untuk memulai kembali server web, pemanasan cache dll.

https://github.com/mpalmer/giddyup

Lihat contoh .

Artur Bodera
sumber
1

Sepertinya Anda harus memiliki dua salinan di server Anda. Salinan kosong, tempat Anda dapat mendorong / menarik, yang akan mendorong perubahan saat selesai, dan kemudian Anda akan mengkloning ini ke direktori web Anda dan mengatur cronjob untuk memperbarui git pull dari direktori web Anda setiap hari atau begitu.

Api
sumber
1

Anda bisa mengatur hook git yang ketika mengatakan komit dibuat untuk mengatakan cabang "stable" itu akan menarik perubahan dan menerapkannya ke situs PHP. Kelemahan besar adalah Anda tidak akan memiliki banyak kontrol jika terjadi kesalahan dan itu akan menambah waktu untuk pengujian Anda - tetapi Anda bisa mendapatkan gambaran tentang berapa banyak pekerjaan yang akan terlibat ketika Anda menggabungkan mengatakan cabang trunk Anda ke cabang stabil untuk mengetahui berapa banyak konflik Anda mungkin temui. Penting untuk mengawasi semua file yang spesifik untuk situs (mis. File konfigurasi) kecuali Anda hanya bermaksud menjalankan satu situs saja.

Atau apakah Anda sudah melihat mendorong perubahan ke situs?

Untuk informasi tentang kait git, lihat dokumentasi githooks .

Chealion
sumber
1

Saya mengambil solusi Kristen .

git archive --prefix=deploy/  master | tar -x -C $TMPDIR | rsync $TMPDIR/deploy/ --copy-links -av [email protected]:/home/user/my_app && rm -rf $TMPDIR/deploy
  • Mengarsipkan cabang master ke tar
  • Ekstrak arsip tar ke direktori deploy di folder temp sistem.
  • perubahan rsync ke server
  • hapus deploy dari folder temp.
Priit
sumber
1

Saya menggunakan solusi berikut oleh toroid.org , yang memiliki skrip kait yang lebih sederhana.

di server:

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

dan instal hook di server:

$ mkdir /var/www/www.example.org
$ cat > hooks/post-receive
#!/bin/sh
GIT_WORK_TREE=/var/www/www.example.org git checkout -f
GIT_WORK_TREE=/var/www/www git clean -f -d # clean directory from removed files

$ chmod +x hooks/post-receive

pada klien Anda:

$ 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

lalu untuk menerbitkan, ketikkan saja

$ git push web

Ada deskripsi lengkap di situs web: http://toroid.org/ams/git-website-howto

Synox
sumber
cara ini tidak menghapus file yang ada di repositori.
RusAlex
2
Kenapa git push web +master:refs/heads/masterbukannya adil git push web master?
Matthieu Moy
1

Sebagai jawaban pelengkap saya ingin menawarkan alternatif. Saya menggunakan git-ftp dan berfungsi dengan baik.

https://github.com/git-ftp/git-ftp

Mudah digunakan, hanya ketik:

git ftp push

dan git akan secara otomatis mengunggah file proyek.

Salam

manuelbcd
sumber
0

Diberikan lingkungan di mana Anda memiliki banyak pengembang yang mengakses repositori yang sama, panduan berikut dapat membantu.

Pastikan Anda memiliki grup unix yang dimiliki oleh semua dev dan berikan kepemilikan repositori .git ke grup itu.

  1. Dalam .git / config dari repositori server, set sharedrepository = true. (Ini memberitahu git untuk mengizinkan banyak pengguna yang diperlukan untuk melakukan dan menyebarkan.

  2. atur umask dari setiap pengguna di file bashrc mereka menjadi sama - 002 adalah awal yang baik

Lloyd Moore
sumber
0

Saya akhirnya membuat alat penyebaran rudimenter saya sendiri yang secara otomatis akan menarik pembaruan baru dari repo - https://github.com/jesalg/SlimJim - Pada dasarnya ia mendengarkan post-accept-hook github dan menggunakan proxy untuk memicu suatu perbarui skrip.

jesal
sumber
0

Saya menggunakan dua solusi untuk hook pasca-terima:

SOLUSI TERGANTUNG 1

#!/bin/bash 
#  /git-repo/hooks/post-receive - file content on server (chmod as 755 to be executed)
# DEPLOY SOLUTION 1 

    export GIT_DIR=/git/repo-bare.git
    export GIT_BRANCH1=master
    export GIT_TARGET1=/var/www/html
    export GIT_BRANCH2=dev
    export GIT_TARGET2=/var/www/dev
    echo "GIT DIR:  $GIT_DIR/"
    echo "GIT TARGET1:  $GIT_TARGET1/"
    echo "GIT BRANCH1:  $GIT_BRANCH1/"
    echo "GIT TARGET2:  $GIT_TARGET2/"
    echo "GIT BRANCH2:  $GIT_BRANCH2/"
    echo ""

    cd $GIT_DIR/

while read oldrev newrev refname
do
    branch=$(git rev-parse --abbrev-ref $refname)
    BRANCH_REGEX='^${GIT_BRANCH1}.*$'
    if [[ $branch =~ $BRANCH_REGEX ]] ; then
        export GIT_WORK_TREE=$GIT_TARGET1/.
        echo "Checking out branch: $branch";
        echo "Checking out to workdir: $GIT_WORK_TREE"; 

        git checkout -f $branch
    fi

    BRANCH_REGEX='^${GIT_BRANCH2}.*$'
    if [[ $branch =~ $BRANCH_REGEX ]] ; then
        export GIT_WORK_TREE=$GIT_TARGET2/.
        echo "Checking out branch: $branch";
        echo "Checking out to workdir: $GIT_WORK_TREE"; 

        git checkout -f $branch
    fi
done

SOLUSI TERGANTUNG 2

#!/bin/bash 
#  /git-repo/hooks/post-receive - file content on server (chmod as 755 to be executed)
# DEPLOY SOLUTION 2

    export GIT_DIR=/git/repo-bare.git
    export GIT_BRANCH1=master
    export GIT_TARGET1=/var/www/html
    export GIT_BRANCH2=dev
    export GIT_TARGET2=/var/www/dev
    export GIT_TEMP_DIR1=/tmp/deploy1
    export GIT_TEMP_DIR2=/tmp/deploy2
    echo "GIT DIR:  $GIT_DIR/"
    echo "GIT TARGET1:  $GIT_TARGET1/"
    echo "GIT BRANCH1:  $GIT_BRANCH1/"
    echo "GIT TARGET2:  $GIT_TARGET2/"
    echo "GIT BRANCH2:  $GIT_BRANCH2/"
    echo "GIT TEMP DIR1:  $GIT_TEMP_DIR1/"
    echo "GIT TEMP DIR2:  $GIT_TEMP_DIR2/"
    echo ""

    cd $GIT_DIR/

while read oldrev newrev refname
do
    branch=$(git rev-parse --abbrev-ref $refname)
    BRANCH_REGEX='^${GIT_BRANCH1}.*$'
    if [[ $branch =~ $BRANCH_REGEX ]] ; then
        export GIT_WORK_TREE=$GIT_TARGET1/.
        echo "Checking out branch: $branch";
        echo "Checking out to workdir: $GIT_WORK_TREE"; 

        # DEPLOY SOLUTION 2: 
        cd $GIT_DIR/; mkdir -p $GIT_TEMP_DIR1; 
        export GIT_WORK_TREE=$GIT_TEMP_DIR1/.
        git checkout -f $branch
        export GIT_WORK_TREE=$GIT_TARGET1/.
        rsync $GIT_TEMP_DIR1/. -v -q --delete --delete-after -av $GIT_TARGET1/.
        rm -rf $GIT_TEMP_DIR1
    fi

    BRANCH_REGEX='^${GIT_BRANCH2}.*$'
    if [[ $branch =~ $BRANCH_REGEX ]] ; then
        export GIT_WORK_TREE=$GIT_TARGET2/.
        echo "Checking out branch: $branch";
        echo "Checking out to workdir: $GIT_WORK_TREE"; 

        # DEPLOY SOLUTION 2: 
        cd $GIT_DIR/; mkdir -p $GIT_TEMP_DIR2; 
        export GIT_WORK_TREE=$GIT_TEMP_DIR2/.
        git checkout -f $branch
        export GIT_WORK_TREE=$GIT_TARGET2/.
        rsync $GIT_TEMP_DIR2/. -v -q --delete --delete-after -av $GIT_TARGET2/.
        rm -rf $GIT_TEMP_DIR2
    fi
done

Kedua solusi didasarkan pada solusi sebelumnya yang tersedia di utas ini.

Perhatikan, BRANCH_REGEX = '^ $ {GIT_BRANCH1}.filter $ 'untuk nama cabang yang cocok dengan string "master " atau "dev *", dan menyebarkan pohon kerja, jika cabang yang didorong cocok. Ini memungkinkan untuk menyebarkan versi dev dan versi master ke tempat yang berbeda.

SOLUSI DEPLOY 1 hanya menghapus file, yang merupakan bagian dari repo, dan telah dihapus oleh komit. Ini lebih cepat dari Solusi Penerapan 2.

DEPLOY SOLUTION 2 memiliki kelebihan, yaitu akan menghapus semua file baru dari direktori produksi, yang ditambahkan di sisi server, tidak peduli apakah itu ditambahkan ke repo atau tidak. Itu akan selalu bersih dari repo. Ini lebih lambat dari Solusi Penerapan 1.

klor
sumber