如何使用 Git 简单地保持本地目录与服务器目录同步?

我习惯使用 FTP,但它很慢并且容易出错。

我可以通过 SSH 访问服务器。我可以在服务器上运行 Git。

我还想避免使用 Github 或 Bitbucket 等第三方 Git 托管服务。我希望能够直接上传到我的服务器。

答案1

本地机器

  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。例如。[电子邮件保护]

    • /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 钩子

    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

并且您的本地目录将同步到服务器目录。


我经常使用的另一个方法:在本地机器上,我保留originGithub/Bitbucket 的远程名称(即项目的“主目录”)和一个特殊的server远程名称(即项目的部署位置)。我还创建了一个 git 分支(也已命名)server,并将其配置为始终推送到server远程:

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

这样,每当我在主分支上时,它就会推送到origin(Github/Bitbucket 等),而当我在server分支上时,它会推送到服务器。

相关内容