管理第三方资产

时间:2014-06-04 12:58:55

标签: git deployment

我目前正在使用git进行版本控制,但也用于部署。在一个网络项目中,我是一名开发人员和图形艺术家,他提供图像和视频等图形资源。

我们目前的设置是这样的:

  1. 有一个当地的回购。我只在这个仓库工作
  2. 服务器上有一个裸仓库,其中本地提交被推送到
  3. 网络服务器上有一个反映当前项目状态的回购
  4. 当一个提交被推送到裸仓库时,会执行一个post-receive挂钩,它基本上将更改拉到了webserver上的repo中。
  5. enter image description here

    这很好,但是我不喜欢抓取资产时的当前工作流程。当图形艺术家完成一些工作时,他总是需要将资产存储在某个地方。然后我需要抓住它们并将它们放入我的本地仓库中,以便能够将它们置于版本控制之下。

    因此,每次更改或添加资产时,我都需要手动关注它并将其复制到我的仓库中。

    我想做的是让图形艺术家在某处推动他的更改,我只能自动从当地回购中获取更改。

    刚才的问题是我不知道如何最好地解决这个问题:

    • 艺术家不需要拥有整个存储库。对他而言,应该像推动他的改变一样简单
    • 我不希望资产成为我的存储库的真正的部分。我只想按需更新资产
    • 资产目录不应影响我的其余仓库。因此,如果我做出某些事情,我不想被迫提取最新资产。

    **文件系统表示**

    / (<- Local git repo)
    -- /css
    -- /js
    -- /assets (<- the directory that should be provided by the artist)
       -- /img
       -- /video
    -- index.html
    

    到目前为止我的想法

    我想到的第一件事就是为艺术家克隆裸露的回购,以便他可以承诺并推动他的变化。

    问题在于他将拥有所有代码的完整仓库,这是我不想要的。他应该保留他的“资产”文件夹,并在有任何内容时尽快将其更改。此外,在他可以推动任何更改之前,如果我做出任何更改,他将不得不更新回购。

    不幸的是,这种方法被删除了。

    是否可以在git中拥有部分存储库,如果是,那么完成该任务的最佳方法或至少是一种常用方法是什么?

2 个答案:

答案 0 :(得分:1)

问题的一个解决方案是git submodules。为您的资产设置定期裸仓库并授予您图形艺术家的访问权限。他把所有东西都推到了这个仓库,不需要知道你的代码。

在您的项目中,您将资产repo添加为子模块:

git submodule add git@yourgithost.com:your/assets/repo.git assets

这将检出资产仓库并将其作为子模块安装。此时,您可能需要git add assets并提交。

艺术家可以在不影响你的情况下做出改变和推动。每当您准备好使用最新版本的资产更新您的仓库时,请转到资产/(这是作为子模块克隆的资产仓库)并提取更改。然后,如果您在项目根目录中运行git status,则会看到类似的内容:

modified:   assets (new commits)

如果您现在git add assets并提交,则会更新资产子模块的指针。

在部署端,您需要在Web服务器上git submodule init assets初始化子模块,并将git submodule update添加到Web服务器上的挂钩,以确保它始终使用你指定的最新提交。

答案 1 :(得分:1)

作为Wally答案的替代方案,您可能需要查看git子树。子树基本上给你一个另一个repo文件的合并副本,并且没有.gitsubmodule文件可以搞乱。众所周知,子模块管理起来有点痛苦(https://www.google.co.uk/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=git%20submodules%20vs%20subtree)。

使用子树

首先将assests repo合并到您的主仓库中。前缀是放置文件的文件夹,您需要将相同的前缀传递给所有'git subtree'命令。壁球压缩远程仓库的历史记录到一次提交,这有助于保持主仓库的历史记录清洁。

git subtree add --prefix assets [--squash] git@yourgithost.com:your/assets/repo.git master

然后,您可以使用

从资产回购获取更新
 git subtree pull --prefix assets [--squash] git@yourgithost.com:your/assets/repo.git master

如果您想自己更改任何资产,可以在回购中执行,然后将其推回资产回购

git subtree push --prefix assets git@yourgithost.com:your/assets/repo.git master

提示:为pull和push命令设置别名!您不需要子树添加命令的别名,因为您只需要运行一次。