2015-04-24 5 views
2

У меня есть ветка, называемая master (Производство), а другая - development. Когда я нажимаю фиксацию от ведущего, выполняется приемный крюк после приема:Как скопировать толкаемую ветку в другой каталог?

git --work-tree=/var/www/mywebsite.com --git-dir=/var/repo/mywebsite.com.git checkout -f 

И веб-сайт в прямом эфире. Но я хочу, чтобы моя ветка development была скопирована в /var/www/mywebsite.com.dev.

+0

Как выглядит ваш «пост-прием»? Он должен считывать строки со стандартного ввода, которые описывают каждую ветвь (ref, фактически), которая была нажата на удаленный, и используя каждую строку для создания соответствующего вызова 'git checkout'. – chepner

+0

Возможно, с 'git archive'? – twalberg

ответ

0

То, что вы пытаетесь сделать вручную, это то, для чего предназначены инструменты, такие как Capistrano, и они сделают это лучше (например, ваша версия не является атомарной, поэтому на вашем сайте есть сочетание старых/новых файлов для в то время как capistrano проверит ваше дерево в каталоге, а затем укажет на него символическую ссылку, которая является атомарной).

Если вы остаетесь с «git checkout», тогда «git checkout development» проверит ветку разработки, поэтому вы хотите выполнить эту команду, когда получите обновление ref для разработки. Сценарий будет идти по линии:

#!/bin/sh 

while read old new refname 
do 
    case "$refname" in 
     refs/heads/master) 
      git --work-tree=/var/www/mywebsite.com --git-dir=/var/repo/mywebsite.com.git checkout -f 
      ;; 
     refs/heads/development) 
      git --work-tree=/var/www/mywebsite.com.dev --git-dir=/var/repo/mywebsite.com.git checkout -f refs/heads/development 
      ;; 
    esac 
done 

Теперь мы можем улучшить сценарий несколькими способами:

  • На самом деле, так как крюк получает новое значение реф, вы даже не требуется имя филиала и может использовать вместо него $ new (более надежный, если в ближайшее время будет доступно несколько обновлений обновления).

  • Для повышения эффективности мы можем сохранить один индексный файл на кассу (так что неизмененные файлы не должны быть на самом деле извлеченным)

  • --git-Dir варианта можно опустить, так как мы проверка из текущего каталога (крюк выполняется в репозитории).

Усовершенствованный сценарий:

#!/bin/sh 

while read old new refname 
do 
    case "$refname" in 
     refs/heads/master) 
      GIT_INDEX_FILE="$PWD"/index.master git --work-tree=/tmp/www/mywebsite.com checkout -f $new 
      ;; 
     refs/heads/development) 
      GIT_INDEX_FILE="$PWD"/index.development git --work-tree=/tmp/www/mywebsite.com.dev checkout -f $new 
      ;; 
    esac 
done 

На схожую тему, вы можете также посмотреть на новое значение updateInstead для receive.denyCurrentBranch введенного в Git 2.3. См. Например раздел «Push to deploy» на странице https://github.com/blog/1957-git-2-3-has-been-released

Смежные вопросы