【问题标题】:git force push current working directorygit force 推送当前工作目录
【发布时间】:2011-11-01 10:18:24
【问题描述】:

我需要 git push 到远程,并且该推送需要是当前工作副本。因为,推送源是一个网络主机。因此,推送的文件需要当前正在使用中。我相信没有人会在主机上编辑文件:)

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

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

Edit2:据我了解,bare repo 不保留文件层次结构,并将 repo 数据保留在根目录中

【问题讨论】:

    标签: git git-push


    【解决方案1】:

    这个问题真的很老了,但我找到了一个比这里列出的解决方案更好的解决方案(至少对于我的情况)。

    manualgit config,从 Git 2.3.0 开始:

    另一个选项是“updateInstead”,如果推入当前分支,它将更新工作目录(必须是干净的)。此选项用于在无法通过交互式 ssh 轻松访问一侧时同步工作目录(例如,实时网站,因此要求工作目录是干净的)。

    所以git config receive.denyCurrentBranch updateInstead(在接收存储库上)非常适合我。它允许我推送自动更新接收存储库的工作目录(只要在推送发生时该工作目录是干净的)。

    【讨论】:

      【解决方案2】:

      虽然这是相当古老的,但非常不鼓励将其推送到工作树。 https://git.wiki.kernel.org/index.php/GitFaq#Unexpected_behavior

      更好的方法是创建一个镜像网站工作树的裸仓库。

      所有的裸仓库都是一个没有工作树或者更确切地说没有签出文件的仓库。层次结构存在所有考虑的事物并且可以被检出。 换句话说,它仅充当更改的主机。

      在不知道您正在使用的网络目录层次结构的情况下,我将假设它是使用 chrooted 主页的标准网站布局 例如:/home/user/www

      在使用 ssh 并安装了 git 的服务器上:

      创建当前站点的工作树

      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 ignore 从长远来看会导致麻烦

      在远程服务器上启用部署后更新

      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
      

      现在我们设置您的网络工作树,以便在提交内容时推送其更改以进行部署。

      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 工作树的情况下进行分支、变基、还原等操作,而无需担心冲突标记,而只需使用裸部署存储库。 如果您需要对提交的内容进行更多控制,您可以使用 post-receive 代替 post-update 或与 post-update 结合使用。

      希望这可以帮助其他希望做与 OP 相同的人。

      【讨论】:

        【解决方案3】:

        这里分步介绍如何在您的网络主机上创建一个允许直接推送的 git 存储库,将其设置为本地存储库的远程,并将更改推送到它。请注意,您需要通过 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 操作指南。

        【讨论】:

        • 嗯,我需要的一切都是recieve.denyCurrentBranch。谢谢:)
        • @yasar11732,请确保您阅读了有关保持工作目录最新的说明。没有它,您推送的更改将反映在 git 历史记录中,但不一定反映在您站点的签出分支中。
        • 唷,这对我来说是一项艰巨的工作,但还是成功了。谢谢!
        • 向原点添加一个额外的 pushurl 可能很有用,这篇文章还有一个示例如何使用 git reset --hard 的 post-update 来更新工作副本:jasper.tandy.is/blogging/…
        猜你喜欢
        • 1970-01-01
        • 2014-12-30
        • 2013-05-09
        • 2014-09-28
        • 1970-01-01
        • 2012-11-24
        • 2016-03-22
        相关资源
        最近更新 更多