我终于在我的工作流程中加入了 GitHub 和 Composer 依赖关系管理。这绝对是向前迈出的一大步,尽管我对GIT管理"嵌套"依赖条件。
由于我使用了很棒的Wordpress Stack ROOTS / BEDROCK,我的简化目录结构如下所示:
|-- /project
| |-- /.git // git repository for the skeleton/stack of the project
| |-- composer.json // list of dependencies, most of them are my own repositories on GitHub
| |-- /vendor
| | |-- /php-dependency-1 // 3rd party dependencies not directly related to Wordpress
| |-- /web
| | |-- /app // acts as "wp-admin" folder
| | | |-- /mu-plugins
| | | | |-- /SUBREPOSITORY-1 // my own framework feature, public, GitHub
| | | | |-- /SUBREPOSITORY-2 // my own framework feature, public, GitHub
| | | |-- /plugins
| | | | |-- /SUBREPOSITORY-3 // my own plugin, public, GitHub
| | | |-- /themes
| | | | |-- /SUBREPOSITORY-5-PARENT-THEME // parent theme used on my framework, public, GitHub
| | | | |-- /SUBREPOSITORY-6-CHILD-THEME // work for client, private, BitBucket
| | |-- /wordpress // Wordpress CMS
| | | |-- /wp-admin
| | | |-- /wp-includes
" Subrepositories"在项目根目录的composer.json
中定义,并由composer install
从GitHub下载。到目前为止一切都很好。
但是!我希望能够调整我的parent-theme
和一些mu-plugins
,我需要能够从我的每个项目中推送/提交它们。如你所知,如果没有wordpress安装,你就无法真正测试wordpress主题...
那么......走哪条路? 有很多关于这个主题的帖子,其中大多数都提到了SubModules ,但是如果我正确地理解了Composer,那么它们就会彼此冲突。
只是使用嵌套的.git存储库看起来很适合我的情况,尽管它似乎不起作用 - 如果我尝试推送/提交嵌套的repo,要么"一切都是最新的"或者我收到Your branch is ahead by 1 commit.
之类的消息所以只是"嵌套它"是不是一个人?
提前致谢并抱歉这个问题有点混乱,我在主题中淹了一点。 :)非常感谢任何帮助。
答案 0 :(得分:30)
我有几个问题,考虑到这一点,下面的答案非常通用。如果你回答我的问题,我很乐意更新。
作曲家是否会在更新中提取回购?还是重新回复了回购? (它甚至在做更新吗?)
作曲家实际上正在进行任何依赖关系管理(即递归以查找嵌套依赖关系)?或者它只是将git项目克隆为子文件夹?
您是否希望主项目跟踪子项目的新变化?
您还可以git clone --recursive
管理单个子模块并使用常规git命令
cd LOCAL_DIR_NAME_I
克隆(主要项目)
git submodule add REMOTE_URI_1 LOCAL_DIR_NAME_1
...
...
git submodule add REMOTE_URI_N LOCAL_DIR_NAME_N
git commit -m "Add submodules..."
git clone MAIN_URI REPO && cd REPO && git submodule update --init --recursive
会在执行更新之前将配置从.gitmodules复制到.git / config,如果需要,--init
将在每个子模块中递归执行该操作。
或
--recursive
git clone --recursive MAIN_URI
告诉git更新并初始化克隆上的所有子模块
更新(将保留未保存的更改)
--recursive
git submodule update [LOCAL_DIR_NAME_I ... LOCAL_DIR_NAME_J]
出版/推
首先尝试子模块推送,如果成功则执行主项目推送
git submodule update --remote --rebase [LOCAL_DIR_NAME_I ... LOCAL_DIR_NAME_J]
你说过使用这种方法有问题,但我不明白它们是什么。请尽可能详细说明。
(git书也谈到了subrepos,但我不能为我的生活找到现在的地方;如果你找到它,请告诉我)
注意:主仓库不会跟踪subrepo的.git更改,只跟踪文件自身
目录名后面的斜杠(/)对于避免创建子模块至关重要
git push --recurse-submodules=on-demand
如果使用Composer:(并且它正在为您执行克隆),您可以简单地执行添加和提交,但也许您可以配置composer来执行此操作。
通过以下方式管理个人子汇贴:`cd LOCAL_DIR_NAME_N'并使用普通的git命令
请记住,您的主要仓库将跟踪对子版本文件的更改
这里最大的问题是克隆(如果您希望colaborator能够处理子项目),因为您的subrepo .git文件没有被跟踪。在每个存储遥控器的子库中包含一个文件remote.info应该解决这个问题。然后在主仓库中添加一个脚本,该脚本适用于每个子目录git clone REMOTE_URI_1 LOCAL_DIR_NAME_1 && git add LOCAL_DIR_NAME_1/
...
...
git clone REMOTE_URI_N LOCAL_DIR_NAME_N && git add LOCAL_DIR_NAME_N/
git commit -m "Add subrepos..."
。根据 Composer 正在执行的操作(请参阅上面的问题),您可能需要向此脚本添加cd SUBDIR && git init && cat remote.info | xargs git remote add origin
命令
我对这种方法的细微之处并不完全有信心,所以我只想链接到它
Try this link for a bit of a tutorial
当然,您可以设置许多其他工作流程,在某些情况下可能更简单。例如,您可以坚持使用 Composer 进行dep管理,并在主项目之外克隆子项目,在主项目中创建未跟踪的符号链接,以便在处理主项目时轻松访问这些文件。这可以通过脚本自动执行(也可以批量推送所有这些repos)。您甚至可以解析composer.json以自动为新的(基于git的)依赖项执行此操作。
注意:在我看来,您根本不需要使用 Composer 。如果这个假设不正确,则上述3个选项中没有一个可以解决您的问题。