git force推送当前工作目录

时间:2011-08-22 19:35:28

标签: git git-push

我需要git push to remote,而push需要是当前的工作副本。因为,推送源是一个Web主机。因此,推送的文件当前需要使用。我相信没有人会在主持人上编辑文件:)

这个问题是对这两个问题的跟进, Is it possible to have a git repo inside another git repowhat difference does --bare switch make when initing a git repo?

编辑:裸仓库不是我想要的,因为文件需要直接在远程机器上使用,需要在我放置它们的位置找到。

Edit2:据我所知,裸仓库不保留文件hieararchy,并将备份数据保存在根目录中

3 个答案:

答案 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一样的行为。