无法让我的(特定的)Git 工作流程工作

Can’t get my (specific) Git workflow to work

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

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

据我所知,你不能在不同的文件夹中有分支,这是有道理的。相反,我将实时存储库克隆到另一个文件夹中。从我的家用电脑,我推送到开发存储库的一个功能分支,在那里我将它与“远程”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. 进行一些更改
  8. ~/dev $ git add .
  9. ~/dev $ git commit -m "Dev commit"
  10. ~/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. 对于这种工作流程你有更好的想法吗?

HEAD 与索引和工作树不同步

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

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

receive.denyCurrentBranch

If set to true or "refuse", git-receive-pack will deny a ref update to the currently checked out branch of a non-bare repository. Such a push is potentially dangerous because it brings the HEAD out of sync with the index and working tree. [...] If set to false or "ignore", allow such pushes with no message. [...]

(我的重点)

尝试运行

$ 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 在

中指出的那样

Pushing to the checked out branch in a non-bare repository is generally not what you want to do

...出于上述原因。

你应该做什么

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

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

向您的存储库添加一个 deploy.sh 脚本怎么样?它可以像

一样简单
cp -r . ~/www

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

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

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

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