我需要git push to remote,而push需要是当前的工作副本。因为,推送源是一个Web主机。因此,推送的文件当前需要使用。我相信没有人会在主持人上编辑文件:)
这个问题是对这两个问题的跟进, Is it possible to have a git repo inside another git repo和what difference does --bare switch make when initing a git repo?
编辑:裸仓库不是我想要的,因为文件需要直接在远程机器上使用,需要在我放置它们的位置找到。
Edit2:据我所知,裸仓库不保留文件hieararchy,并将备份数据保存在根目录中
答案 0 :(得分:10)
以下是如何在您的网络主机上创建一个允许直接推送,将其设置为本地存储库的远程控制器以及推送更改的git存储库的分步骤。请注意,您需要具有对Web主机的ssh访问权限,并且已安装git。
在您的网络主机上(ssh'd in):
# create an empty repo on your web host; note its path
mkdir site
cd site
git init
# configure it to allow pushes to the current checked-out branch
# without complaining (direct push)
git config receive.denyCurrentBranch ignore
现在使用您的本地仓库(在仓库中运行这些git命令):
# create the reference to the web host remote for pushing
# /path/to/the/repo is the path to the repo you made above on the web host:
# it will be an absolute path OR relative to your ssh chroot (depends on the host)
git remote add deploy ssh://your_user@your_host/path/to/the/repo
# finally, push your changes!
git push deploy master
现在,您的更改已被推送到Web主机上的签出仓库。但是,它们不会反映在工作目录中(即,您的更改不会立即生效)。这是因为您已直接推送到活动分支。要完成,你需要
git checkout -f
以更新工作目录git post-receive
挂钩以自动执行此操作。要使用post-receive
挂钩进行即时自动部署,请查看此git site deployment howto。
答案 1 :(得分:6)
这个问题真的很老了,但我找到了一个比这里列出的解决方案更好的解决方案(至少我的情况)。
从git config
git config receive.denyCurrentBranch updateInstead
开始,从Git 2.3.0开始:
另一种选择是" updateInstead"如果进入当前分支,将更新工作目录(必须是干净的)。此选项用于在通过交互式ssh无法轻松访问一侧时同步工作目录(例如,实时网站,因此要求工作目录清洁)。
所以autocommit=0
(在接收存储库上)对我来说非常合适。它允许我自动推送和更新接收存储库的工作目录(只要在推送发生时该工作目录是干净的)。
答案 2 :(得分:4)
虽然这是相当陈旧的,但是非常沮丧地推动工作树。 https://git.wiki.kernel.org/index.php/GitFaq#Unexpected_behavior
更好的方法是创建一个镜像网站工作树的裸仓库。
所有裸仓库都是没有工作树的存储库,或者没有签出文件。层次结构存在所有考虑因素并且可以检出。 换句话说,它仅作为主机进行更改。
在不知道您正在为您的网络工作的目录层次结构的情况下,我将假设它是使用chrooted home的标准网站布局 EG:/ home / user / www
在服务器上使用安装了git的ssh:
创建当前站点的工作树
cd /home/user/public_html
git init
git add .
git commit -m "Initial Commit"
创建一个裸存储库以远程推送到本地系统
mkdir /home/user/deploy.git
cd /home/user/deploy.git
git init --bare
链接您的工作树存储库和您的裸部署存储库
cd /home/user/public_html
git remote add deploy /home/user/deploy.git
git remote show deploy
* remote deploy
URL: /home/user/deploy.git
git push deploy master
现在在本地系统上设置一个新的仓库
git clone ssh://user@example.com/home/user/deploy.git
git branch -a
*master
remotes/origin/HEAD
remotes/origin/master
现在我们设置了2个挂钩,当您按下它时或者如果您提供访问权限的其他人推送它时,立即对您的Web远程仓库进行更改。由于git config receive.denyCurrentBranch忽略会导致长期的麻烦
在远程服务器上启用部署后更新
cd /home/user/deploy.git/hooks
mv post-update.sample post-update
vi post-update
将更新后的挂钩更改为以下内容并保存
#!/bin/sh
echo "Pulling changes into public_html [deploy post-update]"
cd /home/user/public_html || exit
unset GIT_DIR
git pull deploy master
exec git update-server-info
现在我们设置您的Web工作树,以便在将某些内容提交给它时将其更改推送到部署。
cd /home/user/public_html/.git/hooks
mv post-commit.sample post-commit
vi post-commit
然后将post-commit钩子更改为以下
#!/bin/sh
echo "Pushing changes to deploy [public_html post-commit]"
git push deploy
如果需要,您仍然可以选中结帐网络工作树。 这可以让您在推送本地系统的主服务器时将更改从部署提取到Web的工作树。 您可以在不影响Web工作树的情况下进行分支,变基,恢复等,而无需担心冲突标记,而只需使用裸部署存储库。 如果您需要更多地控制所提交的内容,您可以使用post-receive代替或与更新后结合使用。
希望这可以帮助其他人寻求与OP一样的行为。