将远程服务器目录与本地 git 存储库同步

Synchronize a distant server directory with a local git repositery

我想将远程计算机的目录 /home/myproject 与本地计算机的目录 D:\myproject\ 作为源进行同步。我想使用 git (也可以从提交历史记录等中受益)

我是在远程机器上做的(创建裸存储库,另请参阅 What is the difference between "git init" and "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 ]?

如本 tutorial 中所述,这是一个可行的解决方案:

  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. 在远程机器上,创建一个 "bare repository" + 目标目录:

    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 已在远程计算机上更新!

这是一个更简单的解决方案(不需要 "bare" 存储库或 "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。如果您没有这个,并且在您当前的发行版中不可用 this can helpadd-apt-repository ppa:git-core/ppa; apt update; apt install git