如何使用 Git 简单地保持本地目录与服务器目录同步?
我习惯使用 FTP,但它很慢并且容易出错。
我可以通过 SSH 访问服务器。我可以在服务器上运行 Git。
我还想避免使用 Github 或 Bitbucket 等第三方 Git 托管服务。我希望能够直接上传到我的服务器。
答案1
在本地机器:
将要同步的目录初始化为 Git 存储库
git init
提交任何现有代码
git add -A git commit -am "initial commit"
将其远程设置为服务器
git remote set-url origin user@server:/path/to/dir/on/server
在哪里
user
是你通过 SSH 连接到 的用户名server
。例如。[电子邮件保护]/path/to/dir/on/server
您希望将更改同步到服务器上的哪个目录
附注:建议去无密码用于 SSH 登录
在远程机器:
在服务器上初始化一个空目录
mkdir /path/to/dir/on/server cd /path/to/dir/on/server git init
设置其配置以忽略对签出分支的更新
git config receive.denyCurrentBranch ignore
这是必要的,因为(引用如果不这样做会得到的确切错误)“拒绝更新非裸存储库中的当前分支,因为这会使索引和工作树与您推送的内容不一致,并且需要“git reset --hard”将工作树与 HEAD 匹配。“(我们实际上下一步就会这么做)。
设置
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
并且您的本地目录将同步到服务器目录。
我经常使用的另一个方法:在本地机器上,我保留origin
Github/Bitbucket 的远程名称(即项目的“主目录”)和一个特殊的server
远程名称(即项目的部署位置)。我还创建了一个 git 分支(也已命名)server
,并将其配置为始终推送到server
远程:
git config branch.server.remote server
git config remote.server.push server:master
这样,每当我在主分支上时,它就会推送到origin
(Github/Bitbucket 等),而当我在server
分支上时,它会推送到服务器。