【问题标题】:Can’t get my (specific) Git workflow to work无法让我的(特定)Git 工作流程正常工作
【发布时间】:2015-02-14 15:11:27
【问题描述】:

我有一个非常具体的需求,但我无法让它发挥作用,因此我求助于你,Git 和 Stack Overflow 朋友。

我有一台服务器运行我的实时网站。我希望使用 Git 更新网站。为了避免实时测试,我希望在同一台服务器上设置一个测试环境,可以通过子域访问,就好像开发文件夹是 master 的一个分支一样。

据我所知,你不能在不同的文件夹中有分支,这是有道理的。相反,我将实时存储库克隆到另一个文件夹中。从我的家用计算机,我推送到开发存储库的一个功能分支,在那里我将它与“远程”主分支合并,然后将合并推送到实时服务器。

不幸的是,当我尝试将我的开发大师推向实时大师时,git log 确实提到了新的提交,但文件保持不变。 This question 似乎相关,但没有答案解决我的问题。

我做什么(按时间顺序)

  1. ~/www $ git init
  2. ~/www $ git touch file.txt(并填写)
  3. ~/www $ git add .
  4. ~/www $ git commit -m "Initial commit"
  5. ~/dev $ git clone ~/www .
  6. ~/dev/file.txt进行一些更改
  7. ~/dev $ git add .
  8. ~/dev $ git commit -m "Dev commit"
  9. ~/dev $ git push

检查~/www/file.txt 时,没有任何变化:(

~/www(原始存储库)中的 git log 命令确实显示了提交:

commit 677fed22f18d2a98c9b03fc4256c2ef78bd68e8d
Author: Tim Severien <tim********@gmail.com>
Date:   Sat Feb 14 16:36:38 2015 +0100

    Dev commit

commit 7dd9b40dd29a63ba8ea7d647b4afd575f2376659
Author: Tim Severien <tim********@gmail.com>
Date:   Sat Feb 14 16:35:39 2015 +0100

    Initial commit

  1. 为什么我的实时存储库没有更改?
  2. 您对这种工作流程有更好的想法吗?

【问题讨论】:

  • 您可能会通过称呼他们为“神”来吓跑一些潜在的回答者。我们大多数人只是半神,充其量是:) 更严重的是,如果没有更多信息,恐怕您的问题将难以诊断。您能否对其进行编辑并添加您的典型工作流程所包含的命令序列?
  • @Jubobs 感谢您的评论!将“神”更改为“朋友”以使问题更容易理解;)另外,我添加了对我所做工作的分步描述:)
  • git status in ~ 给了我一个致命错误,说它不是存储库。如果您的意思是 ~/www,它会告诉我有一些更改尚未提交,这似乎很奇怪。
  • 可能相关:我将receive.denyCurrentBranch 设置为ignore
  • 推送到非裸存储库中的签出分支通常不是您想要做的

标签: git workflow


【解决方案1】:

推送到非裸仓库有点不寻常。并不是说它不起作用,但是,正如您所注意到的,它可能有点微妙。此外,这样做,您可以在 Web 服务器上获得项目的完整历史记录。这本身不是问题,但似乎是在不必要地浪费空间。

deploy.sh 脚本添加到您的存储库怎么样?例如,它可能很简单

cp -r . ~/www

第一个优势是它可以解决您的推送问题。另一个优势是你可以让它进化,因为你会发现其他需求。例如,第二次迭代可能看起来像

INITIAL_SHA1=$(git rev-parse HEAD)
SHA1_TO_DEPLOY=$1
DEPLOY_ENVIRONMENT=$2

git checkout $SHA1_TO_DEPLOY
if ! ./runTests.sh; then
  echo Commit $SHA1_TO_DEPLOY is corrupted. Won't deploy it
else
  cp -r . $DEPLOY_ENVIRONMENT
fi
git checkout $INITIAL_SHA1

当然,这不是对您问题的直接回答,但我相信它可能会满足您的需求。

【讨论】:

    【解决方案2】:

    HEAD 与索引和工作树不同步

    通过在位于~/www 的存储库中将receive.denyCurrentBranch 设置为ignore,您允许推送到其签出分支(此处为master),这会使HEAD 与索引和工作树。

    git-config man page中解释了这种现象:

    receive.denyCurrentBranch

    如果设置为 true"refuse"git-receive-pack 将拒绝更新到 当前签出的非裸存储库分支。 这样的推动 具有潜在危险,因为它会使 HEAD 与 索引和工作树。 [...] 如果设置为 false"ignore",允许在没有消息的情况下进行此类推送。 [...]

    (我的重点)

    尝试运行

    $ git diff
    $ git diff --cached
    diff --git a/file.txt b/file.txt
    index ce01362..e69de29 100644
    --- a/file.txt
    +++ b/file.txt
    @@ -1 +0,0 @@
    -hello
    

    ~/www。请注意,git diff 不输出任何内容,证明工作树和索引是同步的,而git diff --cached 显示HEAD 和索引之间的差异。

    你做错了什么

    正如 Andrew C 在his comment 中指出的那样,

    推送到非裸存储库中的签出分支通常不是您想要做的

    ...出于上述原因。

    你应该怎么做

    您应该重新考虑您的工作流程并避免这种情况。问题Push to a non-bare Git repository 及其答案应该是相关的,在这里。

    【讨论】:

      猜你喜欢
      • 2015-09-08
      • 1970-01-01
      • 2014-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-05
      • 2017-11-06
      相关资源
      最近更新 更多