Как я могу использовать Git, чтобы просто синхронизировать локальный каталог с каталогом сервера?

Я привык к FTP, но он медленный и подвержен ошибкам.

У меня есть SSH доступ к серверу. Я могу запустить Git на сервере.

Я также хочу избежать стороннего хостинга Git, такого как Github или Bitbucket. Я хочу иметь возможность напрямую загружать на свой сервер.

1 ответ1

2

На локальной машине:

  1. Инициализируйте каталог для синхронизации как Git-репозиторий

    git init
    

    Зафиксируйте любой существующий код

    git add -A
    git commit -am "initial commit"
    
  2. Установите его удаленным к серверу

    git remote set-url origin user@server:/path/to/dir/on/server
    

    куда

    • user - это имя пользователя, которое вы используете для SSH на вашем server . Например. root@10.10.10.10

    • /path/to/dir/on/server - это каталог на сервере, с которым вы хотите синхронизировать свои изменения

    Примечание: желательно использовать пароль без логина для входа по SSH.

На удаленной машине:

  1. Инициализировать пустой каталог на сервере

    mkdir /path/to/dir/on/server
    cd /path/to/dir/on/server
    git init
    
  2. Настройте его конфигурацию так, чтобы игнорировать обновления для извлеченной ветки

    git config receive.denyCurrentBranch ignore
    

    Это необходимо, потому что (цитируя точную ошибку, которую вы получите, если вы этого не сделаете) « обновление текущей ветки в не-пустом хранилище запрещено, потому что это сделает индекс и дерево работы несовместимыми с тем, что вы нажали, и потребует 'git reset --hard' для сопоставления рабочего дерева с HEAD. "(на самом деле мы сделаем это на следующем шаге).

  3. Установите post-receive git hook:

    Создайте файл post-receive в каталоге .git/hooks и откройте его в редакторе:

    vim .git/hooks/post-receive
    

    Поместите следующее:

    #!/bin/sh
    git --git-dir=. --work-tree=.. checkout -f
    

    Установите его режим на исполняемый файл:

    chmod +x .git/hooks/post-receive
    

    Это будет проверять ваши последние изменения в каталоге сервера всякий раз, когда вы нажимаете любой.

  • Один вкладыш для всего вышеперечисленного:

    dir=<dir>; mkdir $dir && cd $dir && git init && git config receive.denyCurrentBranch ignore && printf '#!/bin/sh\ngit --git-dir=. --work-tree=.. checkout -f' > .git/hooks/post-receive && chmod +x .git/hooks/post-receive
    

Теперь на локальной машине вы можете сделать это:

git commit -am "Some changes"
git push

и ваш локальный каталог будет синхронизирован с сервером.


Дополнительный рецепт , который я часто использую: На локальной машине, я держу origin имя удаленного для Github/Bitbucket , который является "домом" проекта, а также специальный server удаленного имя , которое где развертываются. Я также создаю server git branch (который также называется) и настраиваю его на постоянную передачу на удаленный server :

git config branch.server.remote server
git config remote.server.push server:master

Таким образом, всякий раз, когда я нахожусь в основной ветке, он перемещается к origin (Github/Bitbucket и т.д.), А когда я нахожусь в ветке server он толкает к серверу.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .