无法使我的(特定)Git工作流程正常工作

时间:2015-02-14 15:11:28

标签: git workflow

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

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

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

Workflow

不幸的是,当我尝试将我的开发大师推送到主服务器时,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
  11. 检查~/www/file.txt时,没有任何变化:(

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

    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. 您对此类工作流程有更好的想法吗?

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:0)

HEAD与索引和工作树

不同步

通过在receive.denyCurrentBranch生成的存储库中将ignore设置为~/www,您可以将其推送到已检出的分支(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及其答案应该与此相关。