Git рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд╛рдЗрдЯреЛрдВ рдХрд╛ рд╕рдореВрд╣ рд╡рд┐рдХрд╛рд╕ - git brunches рд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдирд┐рд░реНрдорд╛рдг / рд╕рд╛рдЗрдЯреЛрдВ рдХреЛ рд╣рдЯрд╛рдирд╛

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рджрд┐рдЦрд╛рдКрдБрдЧрд╛ рдХрд┐ git рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ git рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд╛рдЗрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдореВрд╣ рд╡рд┐рдХрд╛рд╕ рдХрд╛ рд╡рд╛рддрд╛рд╡рд░рдг рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдЦ рдЕрдиреБрднрд╡реА рдкреНрд░рдгрд╛рд▓реА рдкреНрд░рд╢рд╛рд╕рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдореИрдВ рдХреЗрд╡рд▓ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ред
рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдмрд╣реБрдд рдкрд╣рд▓реЗ рд╣реА рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛ рдЪреБрдХреА рд╣реИ, рдФрд░ рдореИрдВ рдпрд╣ рдЬреЛрдбрд╝реВрдВрдЧрд╛ рдХрд┐ рдЬреАрдЖрдИрдЯреА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдмреНрд░рдВрдЪ рдмрдирд╛рдиреЗ / рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЗрдЯреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХреИрд╕реЗ рдмрдирд╛рдПрдВ рдпрд╛ рд╣рдЯрд╛рдПрдВред рдРрд╕рд╛ рдЕрд╡рд╕рд░ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╕рд╛рдЗрдЯ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╣рд┐рд╕реНрд╕реЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ (рдмреНрд░рдВрдЪ) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдореБрдЦреНрдп рд╡рд┐рдХрд╛рд╕ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рдж, рдорд░реНрдЬ рдХреЛ рдореБрдЦреНрдп рд╢рд╛рдЦрд╛ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдмреНрд░рдВрдЪ рдФрд░ рдкрд░реАрдХреНрд╖рдг рд╕рд╛рдЗрдЯреЛрдВ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред



рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдПрдХ рдорд╛рд╕реНрдЯрд░ рд╢рд╛рдЦрд╛ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореБрдЦреНрдп рд╕рд╛рдЗрдЯ рд╕реБрд▓рдн рд╣реИред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдмреНрд░рдВрдЪ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ branchname.projectname.domain.ru рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рдХрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдореБрдЦреНрдп рд╢рд╛рдЦрд╛ рдореЗрдВ рд╡рд┐рд▓рдп рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЪрд╛рд╣реЗ рдорд╛рд╕реНрдЯрд░ рдпрд╛ рдХреЛрдИ рдЕрдиреНрдп)ред рдФрд░ рдпрджрд┐ рдЖрдк рдмреНрд░рдВрдЪ рд╣рдЯрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЙрд╕реА рдирд╛рдо рдХреА рд╕рд╛рдЗрдЯ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╣рдЯрд╛ рджреА рдЬрд╛рддреА рд╣реИред

рдЧрд┐рдЯ рд╕реЗрдЯрдЕрдк


рд╣рдо рдПрдХ git рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдмрдирд╛рддреЗ рд╣реИрдВ, factory.domain.ru/git/projectname рдкрд░ рдЗрд╕рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЖрдИрдкреА рдХреЗ рд▓рд┐рдП рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рдмрд┐рдирд╛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рд╡рд┐рдХрд╛рд╕ рд╕рд░реНрд╡рд░ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдЧрд┐рдЯ рд╕рд░реНрд╡рд░ рдХрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдмрд╛рд░-рдмрд╛рд░ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рдЖрдЗрдЯрдо рдХрд╛ рд╡рд┐рд╡рд░рдг рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ред

рдЧрд┐рдЯ рд╣реБрдХ рдмрдирд╛рдПрдБ


рд╣рдо рдлрд╝рд╛рдЗрд▓ / srv / git / projectname / рд╣реБрдХ / рдкреЛрд╕реНрдЯ-рдЕрдкрдбреЗрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ (рдпрд╣ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рд╛рдЗрдЯ рдкрд░ рдХреЛрдб рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░ рджреЗрдЧреА рдЬрдм рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдкреНрд░реЙрдЬреЗрдХреНрдЯ рдЪрд░ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдирд╛рдо рдФрд░ GIT_URL рдХреЗ рд▓рд┐рдП git рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХрд╛ рд▓рд┐рдВрдХ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ):
#!/bin/sh PATH=/usr/bin:/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin:$PATH PROJECT="projectname" GIT_URL="http://factory.domain.ru/git" git update-server-info if [ ! -f $1 ]; then exit 0 fi while [ -n "$1" ] do REF=`echo $1 | awk --field-separator="/" '{print $2}'` if [ $REF = "branches" -o $REF = "heads" ]; then BRANCH=`echo $1 | awk --field-separator="/" '{print $3}'` if [ ! -d /srv/www/$PROJECT/repo/master ]; then mkdir -p /srv/www/$PROJECT/repo GIT_SSL_NO_VERIFY=true git clone $GIT_URL/$PROJECT /srv/www/$PROJECT/repo/master fi if [ ! -d /srv/www/$PROJECT/repo/$BRANCH ]; then GIT_SSL_NO_VERIFY=true git clone -b $BRANCH $GIT_URL/$PROJECT /srv/www/$PROJECT/repo/$BRANCH else cd /srv/www/$PROJECT/repo/$BRANCH GIT_SSL_NO_VERIFY=true git fetch origin GIT_SSL_NO_VERIFY=true git reset --hard origin/$BRANCH GIT_SSL_NO_VERIFY=true git clean -d -f GIT_SSL_NO_VERIFY=true git checkout GIT_SSL_NO_VERIFY=true git pull fi fi shift done 


рд╣рдо рдлрд╝рд╛рдЗрд▓ / srv / git / projectname / рд╣реБрдХ / рдЕрдкрдбреЗрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ (рдпрд╣ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирдИ рдмреНрд░рдВрдЪ рдХреЛ рдмрдирд╛рддреЗ / рд╣рдЯрд╛рддреЗ рд╕рдордп рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рд╛рдЗрдЯреЗрдВ рдмрдирд╛рдПрдЧреА / рд╣рдЯрд╛рдПрдЧреА; рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдирд╛рдо PROJECT рд╡реИрд░рд┐рдПрдмрд▓ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ):
 #!/bin/sh refname="$1" oldrev="$2" newrev="$3" PROJECT="projectname" # --- Safety check if [ -z "$GIT_DIR" ]; then echo "Don't run this script from the command line." >&2 echo " (if you want, you could supply GIT_DIR then run" >&2 echo " $0 <ref> <oldrev> <newrev>)" >&2 exit 1 fi if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then echo "Usage: $0 <ref> <oldrev> <newrev>" >&2 exit 1 fi # --- Check types # if $newrev is 0000...0000, it's a commit to delete a ref. zero="0000000000000000000000000000000000000000" if [ "$newrev" = "$zero" ]; then newrev_type=delete else newrev_type=$(git cat-file -t $newrev) fi BRANCH=`echo $1 | awk --field-separator="/" '{print $3}'` delete () { mv /srv/www/$PROJECT/repo/$BRANCH /srv/www/$PROJECT/repo/$BRANCH.removed_by_git rm -rf /srv/www/$PROJECT/repo/$BRANCH.removed_by_git } case "$refname","$newrev_type" in refs/heads/*,delete) # delete branch delete ;; refs/remotes/*,delete) # delete tracking branch delete ;; esac exit 0 


Nginx рдФрд░ Apache рдХреЛ рд╢рд╛рдЦрд╛.рдкреНрд░реЛрдЬреЗрдХреНрдЯname.domain.ru рдбреЛрдореЗрди рдХреЛ рд╕рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ


рдПрдХ vhost-config рдмрдирд╛рдПрдБ рдФрд░ рдЗрд╕реЗ рдореБрдЦреНрдп nginx config рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ:
 server { listen 80; # projectname    ,  domain -    . master-     projectname.domain.ru server_name ~^(?P<branch>.*)\.projectname\.domain\.ru$ projectname.domain.ru; if ($branch = "") { set $branch "master"; } access_log /srv/www/projectname/logs/projectname.domain.ru-acc main; error_log /srv/www/projectname/logs/projectname.domain.ru-err; #     apache mod_php location / { proxy_pass http://127.0.0.1:8080; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_read_timeout 300; client_max_body_size 256m; proxy_buffer_size 16k; proxy_buffers 32 16k; } #    "data",      http://projectname.domain.ru/data.      ,      . #  ,    php     data,     git-,         . #          DOCUMENT_ROOT,        . #  ,   /srv/www/projectname/data ,  , apache:apache ( chmod 777),   /srv/www/projectname/repo - username:username. location ^~ /data/ { root /srv/www/projectname; } #     apache. location ~* \.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|swf|flv|avi|djvu|mp3|mp4|ogv)$ { root /srv/www/projectname/repo/$branch/htdocs; } #     ".git". location ~ /\.git { deny all; } #      ,    /srv/www/robots.txt  ,    (     robots.txt  ): # User-Agent: * # Disallow: / #  ,   ,    robots.txt  ,      /srv/www,      . location = /robots.txt { root /srv/www; } } 


рд╡рд╣ рд╕рдм рдХреБрдЫ рдЬреЛ рдЕрдкрд╛рдЪреЗ рдХреЗ рд▓рд┐рдП vhost рдХреЙрдиреНрдлрд┐рдЧрд░ рд╣реИ:
 <VirtualHost *> # -  master- DocumentRoot /srv/www/projectname/repo/master/htdocs ServerName projectname.domain.ru ErrorLog /srv/www/projectname/logs/projectname.domain.ru-err <Location /> php_admin_value open_basedir "/usr/share/pear:/srv/www/projectname:/tmp" php_admin_value upload_tmp_dir "/srv/www/projectname/tmp" php_admin_value session.save_path "/srv/www/projectname/tmp" php_admin_value memory_limit "256M" php_value post_max_size "256M" php_value upload_max_filesize "256M" </Location> <Directory /srv/www/projectname/repo> Options Includes FollowSymLinks MultiViews AllowOverride All Order allow,deny Allow from all </Directory> </VirtualHost> <VirtualHost *> #  "  "   VirtualDocumentRoot #   rewrite-  .htaccess   VirtualDocumentRoot    500,       "RewriteBase /"  .htaccess. VirtualDocumentRoot /srv/www/projectname/repo/%1/htdocs ServerName dev.projectname.domain.ru ServerAlias *.projectname.domain.ru ErrorLog /srv/www/projectname/logs/projectname.domain.ru-err <Location /> php_admin_value open_basedir "/usr/share/pear:/srv/www/projectname:/tmp" php_admin_value upload_tmp_dir "/srv/www/projectname/tmp" php_admin_value session.save_path "/srv/www/projectname/tmp" php_admin_value memory_limit "256M" php_value post_max_size "256M" php_value upload_max_filesize "256M" </Location> <Directory /srv/www/projectname/repo> Options Includes FollowSymLinks MultiViews AllowOverride All Order allow,deny Allow from all </Directory> </VirtualHost> 


рд╡рд╣ рд╕рдм рд╣реИ! рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдмрдиреНрдзрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╕рдордп рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рд╛рде рд╣реА рдПрдХреНрд╕реЗрд╕ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реЗрдбрдорд╛рдЗрди рдХреЛред рдПрдХреНрд╕реЗрд╕ рд░рд╛рдЗрдЯреНрд╕ рднреЗрджрднрд╛рд╡ рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд▓рдЧрдЗрди рд▓рд┐рдЦрдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реЛрдЧрд╛, рдЬреЛ рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рддреИрдирд╛рдд рдпрд╛ рд░реЛрд▓рдмреИрдХ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ (рдХреИрдкрд┐рд╕реНрдЯреНрд░рд╛рдиреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ)ред

рд╣рдо 100 рд╕реЗ рдЕрдзрд┐рдХ рд▓реЛрдЧреЛрдВ рдХреЗ рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдмрдбрд╝реА рд╡рд┐рдЬреНрдЮрд╛рдкрди рдПрдЬреЗрдВрд╕реА рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╕реНрд╡рдЪрд╛рд▓рди рдорд╛рдирд╡ рдХрд╛рд░рдХ рдХреЗ рдХрд╛рд░рдг рдХреА рдЧрдИ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдХрд╛рдлреА рдХрдо рдХрд░ рджреЗрддрд╛ рд╣реИ, рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдПрдХ рдирдпрд╛ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдпрд╛ рдПрдХреНрд╕реЗрд╕ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╛рдд рдореЗрдВ рдПрдбрдорд┐рди рдХреЛ рдЬрдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд▓рд┐рдЦреЗрдВ рдХрд┐ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдХреМрди рд╕реЗ рдкреНрд░рд╢реНрди рдЖрдк рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ - рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдирдП рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛!

Source: https://habr.com/ru/post/In158855/


All Articles