我目前正在使用git进行版本控制,但也用于部署。在一个网络项目中,我是一名开发人员和图形艺术家,他提供图像和视频等图形资源。
我们目前的设置是这样的:
这很好,但是我不喜欢抓取资产时的当前工作流程。当图形艺术家完成一些工作时,他总是需要将资产存储在某个地方。然后我需要抓住它们并将它们放入我的本地仓库中,以便能够将它们置于版本控制之下。
因此,每次更改或添加资产时,我都需要手动关注它并将其复制到我的仓库中。
我想做的是让图形艺术家在某处推动他的更改,我只能自动从当地回购中获取更改。
刚才的问题是我不知道如何最好地解决这个问题:
**文件系统表示**
/ (<- Local git repo)
-- /css
-- /js
-- /assets (<- the directory that should be provided by the artist)
-- /img
-- /video
-- index.html
到目前为止我的想法
我想到的第一件事就是为艺术家克隆裸露的回购,以便他可以承诺并推动他的变化。
问题在于他将拥有所有代码的完整仓库,这是我不想要的。他应该保留他的“资产”文件夹,并在有任何内容时尽快将其更改。此外,在他可以推动任何更改之前,如果我做出任何更改,他将不得不更新回购。
不幸的是,这种方法被删除了。
是否可以在git中拥有部分存储库,如果是,那么完成该任务的最佳方法或至少是一种常用方法是什么?
答案 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命令设置别名!您不需要子树添加命令的别名,因为您只需要运行一次。