Deploy directly, without remote repository and Git server
Requirements:
- SSH server access
- git is installed on the local machine, as well as rsync or git-sync
- on git server is not needed
What to do?
It is not necessary to install Git on the server or copy the .git
folder there. To update the server from the git repository, you can use the following command:
git ls-files -z | rsync --files-from - --copy-links -av0 . user@server.com:/var/www/project
This command copies all files. rsync uses ssh (secure shell) , which is installed on the server in any case.
But at the same time, you will probably have to manually delete files that were deleted from the project (that is, they did not change, but ceased to exist in the next commit).
Instead of rsync, you can use the git-sync utility written by Ian Bicking . According to the author, it works with Git faster than rsync.
Why is this a good way?
The less software you have installed on the server, the more secure it is and the easier it is to administer and document it. By the way, it also excludes the need to keep a full Git repository with the entire history on the server. This would only complicate the server security task.
(Written based on the answer by @Christian , Ian Bicking blog)
Deploy via a remote repository on the server.
This method carries the risk of data leakage!
Sources of 3300 global Internet projects were received.
Requirements:
- SSH server access
- Git is installed on the server.
- Git-server is installed on the server, for example Gitlab or Gitstack .
- Git is installed on the local machine.
If you start from a server with files and without a repository
On the server in the project folder run:
git init git add --all git commit -m'сообщение, описывающее текущее состояние проекта'
And go to the next item.
If you start from the server with the files and repository
Select a folder on the local machine where the project will be located. Run there:
git clone -o production username@webserver:/path/to/htdocs/.git
If you start from a local repository
- Copy your local
.git
folder to the server. In the local copy, open .git/config
and add your server as remote
:
[remote "production"] url = username@webserver:/path/to/htdocs/.git
a common part
- On the server, replace
.git/hooks/post-update
with the code below in this answer. On the server, add write access to this file:
chmod +x .git/hooks/post-update
Now, when you do git push
from a local repository, the repository on the server should automatically update the working directory:
git push production
Useful links on the topic:
http://toroid.org/ams/git-website-howto
https://www.digitalocean.com/community/tutorials/how-to-set-up-automatic-deployment-with-git-with-a-vps
post-update hook:
Git-hook found on this site .
#!/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
The answer is written based on responses from the English StackOverflow . Added, reworked, collected in one answer.
master
branch orgithub-pages
- and the site has been updated. pages.github.com - Nick Volynkin ♦