【问题标题】:Git: Deploy only a directory from post-receive hookGit:仅从 post-receive 挂钩部署目录
【发布时间】:2014-01-09 23:33:57
【问题描述】:

按照this article 的指示,我有一个接收后挂钩,目前显示为:

#!/bin/sh
git --work-tree=/home/user/example.com --git-dir=/home/user/example.com.git checkout -f

这运行良好 - 所有文件和目录都已部署。但是,我只想部署 example.com.git 中 Build 文件夹中的文件(顺便说一下,我使用的是 Hammer。)所以并不是所有的开发文件都可以在实时服务器上使用和查看。

问题:为了只签出/部署 Build 目录中的内容,我应该对上述 Git 命令进行哪些更改/添加?

更新: 在 cmets 中讨论之后,我得出以下结论,这适用于我的情况。

#!/bin/sh
git --work-tree=/home/user/example.com --git-dir=/home/user/example.com.git checkout -f master -- Build/
cd /home/user/example.com
cp -rRp Build/. .
rm -rf Build

【问题讨论】:

  • 您最终不会在 .用你自己提供的答案?除了 Build/ 之外的所有东西都会在那里,不是吗?我认为@yanhan 的回答(使用 git checkout 的 参数)更好。
  • 我尝试了@yanhan 的答案,它给出了一些 git 错误,而这个 ^ 答案没有给出任何错误,但也没有做任何工作。 Git 推送成功完成,但远程仓库仍然为空(未更改)。 ://

标签: git deployment


【解决方案1】:

我将提供给--work-tree--git-dir 的值分别缩写为WTREPO,这样所有内容都可以在没有水平滚动条的情况下适应。

一般形式应该是:

#!/bin/sh
git --work-tree=WT --git-dir=REPO checkout -f -- paths

假设在实时服务器上部署的WT 目录中,您只想签出存储库中的Build 文件夹。这变成了

#!/bin/sh
git --work-tree=WT --git-dir=REPO checkout -f -- Build

一般来说,您可以将paths 部分替换为git 存储库中的一个或多个文件。根据它们在存储库中的放置方式,它们被指定为相对路径。所以如果你的 git repo 看起来像这样:

FolderOne
|- FolderTwo
|  |- FileOne
|- FolderThree

FolderFour
|- FileFive

如果你想结帐FileOne 和所有FolderFour,你应该这样做:

git --work-tree=WT --git-dir=REPO checkout -f -- FolderOne/FolderTwo/FileOne FolderFour

更新:

我已经有一段时间没有处理 Git 钩子了,但我认为除了它们的标准输入和 argv 之类的一些细节之外,你可以在里面放任何东西。

因此,要检查 Build 文件夹中的所有内容,而不是 Build 文件夹本身,您可以在 post-receive 挂钩中执行以下操作:

git --work-tree=WT --git-dir=REPO checkout -f -- Build/
cd WT
cp -r Build/* .
rmdir Build

所以我们首先将Build 目录签入WT 目录。然后我们将cd 放入WT 目录,使用cp -r Build/* .Build 目录中复制所有内容。 . 代表当前目录,也就是我们刚刚cd 进入的WT 目录。完成后,我们将删除现在为空的 Build 目录。

因此,Build 目录中的所有内容现在都被检出到WT 目录中,而Build 目录本身则没有。当然,您必须分别将 WTREPO 替换为工作树和 git 存储库的实际路径。

希望有帮助

【讨论】:

  • 这行得通。虽然我想将所有内容都包含在 Build 文件夹中,但不是文件夹本身。我尝试使用 Build/*,但没有任何运气。
  • 在那种情况下,我相信你可以按照cp -r REPO/Build/* WorkTree in the hook 的方式做一些事情
  • 你能帮我拼一下吗?我不太习惯 Git。我用自己的文件路径尝试了一些变体,但没有结果。
  • 嗨 Eystein,我已经更新了答案。请注意,我没有尝试过上面的代码,因此您可能想在实际部署文件夹本身以外的地方尝试它。
  • 是的,我没有意识到* 不会复制以. 开头的文件。至于cp,在cp 手册页上的查找告诉我-r-R 标志是相同的,因此使用它们中的任何一个都可以,而不是同时使用它们。 -p 标志与 --preserve=mode,ownership,timestamps 相同。
【解决方案2】:

yanhan 的解决方案对我不起作用.. 这是我的方法...

#!/bin/bash
TARGET="/htdocs/my-project/public"
TEMP="/htdocs/my-project/tmp"
PUBLIC="/htdocs/my-project/tmp/public"
GIT_DIR="/htdocs/my-project/test.git"
BRANCH="master"

while read oldrev newrev ref
do
    if [[ $ref = refs/heads/$BRANCH ]];
    then
        # create temp directory
        mkdir $TEMP
        # check out the master branch
        git --work-tree=$TEMP --git-dir=$GIT_DIR checkout -f 
        # remove current target files and directory
        rm -rf $TARGET
        # move contents of the chosen folder to the target 
        mv $PUBLIC $TARGET
        # delete the tmp directory since not needed anymore..
        rm -rf $TEMP
    fi
done

【讨论】:

    猜你喜欢
    • 2015-08-31
    • 1970-01-01
    • 2012-05-18
    • 2014-05-13
    • 2014-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    相关资源
    最近更新 更多