Синхронизировать каталог удаленного сервера с локальным git-репозиторием

Я хочу синхронизировать каталог /home/myproject моей удаленной машины с, в качестве источника, каталогом D:\myproject\ моей локальной машины. Я хотел бы использовать git (также извлечь выгоду из истории коммитов и т. д.)

Я сделал это на удаленной машине (создание чистого хранилища, см. Также В чем разница между "git init" и "git init --bare"?):

mkdir /home/myproject.git
cd /home/myproject.git
git init --bare

и это на локальной машине (с текущей директорией D:\myproject\):

git init
git add main.py   # D:\myproject\main.py exists on local machine
git commit -m "First"
git remote add dest root@203.0.113.0:/home/myproject.git    # via ssh
git push dest master

Это работает, теперь удаленный сервер /home/myproject.git синхронизируется, но каталог /home/myproject/ (это должно содержать, например, /home/myproject/main.py) до сих пор не существует!

Поэтому я должен сделать это на удаленном сервере:

cd /home
git clone myproject.git myproject

и сейчас /home/myproject/main.py существует.

Проблема: каждый раз, когда я делаю git push на локальной машине, это удаленный сервер /home/myproject.git который обновляется, а не /home/myproject/,

Вопрос: как настроить эти репозитории так, чтобы git push автоматически обновляет все файлы в /home/myproject такие как /home/myproject/main.py , а не только /home/myproject.git ?

2 ответа

Решение

Вот более простое решение (не требующее "чистого" хранилища или скрипта "post-receive hook"):

  1. На удаленном компьютере создайте целевой репозиторий и настройте его следующим образом:

    mkdir /home/myproject && cd /home/myproject
    git init
    git config receive.denyCurrentBranch updateInstead
    
  2. На локальной машине (из рабочего каталога D:\myproject\), создайте исходный репозиторий и отправьте его:

    git init
    git add main.py
    git commit -m "First"
    git remote add dest root@203.0.113.0:/home/myproject
    git push -u dest master
    

    Сейчас /home/myproject обновляется на далекой машине!

Примечание: для этого требуется версия git>= 2.4. Если у вас его нет и он недоступен в вашем текущем выпуске, это может помочь: add-apt-repository ppa:git-core/ppa; apt update; apt install git,

Как объяснено в этом руководстве, вот рабочее решение:

  1. На локальной машине (из рабочего каталога D:\myproject\), создайте репозиторий:

    git init
    git add main.py
    git commit -m "First"
    git remote add dest root@203.0.113.0:/home/myproject.git
    
  2. На удаленном компьютере создайте "пустой репозиторий" + каталог назначения:

    mkdir /home/myproject.git && cd /home/myproject.git && git init --bare
    echo -e '#!/bin/sh\nGIT_WORK_TREE=/home/myproject git checkout -f' > hooks/post-receive
    chmod +x hooks/post-receive
    
    mkdir /home/myproject
    
  3. На локальной машине:

    git push -u dest master        # later we can just do: git push
    

Сейчас /home/myproject обновляется на далекой машине!

Другие вопросы по тегам