无法让我的(特定的)Git 工作流程工作
Can’t get my (specific) Git workflow to work
我有一个非常具体的需求,但我无法让它工作,因此我求助于你,Git 和 Stack Overflow 的朋友们。
我有一台运行我的实时网站的服务器。我希望使用 Git 更新网站。为了避免现场测试,我希望在同一台服务器上设置一个测试环境,通过子域访问,就好像开发文件夹是master的一个分支。
据我所知,你不能在不同的文件夹中有分支,这是有道理的。相反,我将实时存储库克隆到另一个文件夹中。从我的家用电脑,我推送到开发存储库的一个功能分支,在那里我将它与“远程”master 分支合并,然后将合并推送到实时服务器。
不幸的是,当我尝试将我的开发大师推送到实时大师时,git log
确实提到了新的提交,但文件保持不变。 This question 似乎相关,但没有答案解决我的问题。
我是做什么的(按时间顺序排列)
~/www $ git init
~/www $ git touch file.txt
(并填写)
~/www $ git add .
~/www $ git commit -m "Initial commit"
~/dev $ git clone ~/www .
- 对
~/dev/file.txt
进行一些更改
~/dev $ git add .
~/dev $ git commit -m "Dev commit"
~/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
- 为什么我的实时存储库没有变化?
- 对于这种工作流程你有更好的想法吗?
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
当然,这不是您问题的直接答案,但我相信它可能会满足您的需求。
我有一个非常具体的需求,但我无法让它工作,因此我求助于你,Git 和 Stack Overflow 的朋友们。
我有一台运行我的实时网站的服务器。我希望使用 Git 更新网站。为了避免现场测试,我希望在同一台服务器上设置一个测试环境,通过子域访问,就好像开发文件夹是master的一个分支。
据我所知,你不能在不同的文件夹中有分支,这是有道理的。相反,我将实时存储库克隆到另一个文件夹中。从我的家用电脑,我推送到开发存储库的一个功能分支,在那里我将它与“远程”master 分支合并,然后将合并推送到实时服务器。
不幸的是,当我尝试将我的开发大师推送到实时大师时,git log
确实提到了新的提交,但文件保持不变。 This question 似乎相关,但没有答案解决我的问题。
我是做什么的(按时间顺序排列)
~/www $ git init
~/www $ git touch file.txt
(并填写)~/www $ git add .
~/www $ git commit -m "Initial commit"
~/dev $ git clone ~/www .
- 对
~/dev/file.txt
进行一些更改
~/dev $ git add .
~/dev $ git commit -m "Dev commit"
~/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
- 为什么我的实时存储库没有变化?
- 对于这种工作流程你有更好的想法吗?
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 tofalse
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
当然,这不是您问题的直接答案,但我相信它可能会满足您的需求。