1

我在 github 上托管了一个项目,其结构如下

github.com/example/allpackages

.
├── .git
└── packages
    ├── example-1
    ├── example-2
    └── example-3

在每次推送到 github 时,我希望将每个包的内容推送到与 repo 名称相对应的 repo,例如

github.com/example/example1

.
├── .git
└── example1

github.com/example/example2

.
├── .git
└── example2

等等

有人对如何自动化这个有任何想法吗?有人提到使用 Travis-CI 来完成这项任务,但我找不到任何关于它如何工作的细节。

我的理想解决方案:

  • 将完全自动化——这意味着更新不会由推送计算机触发,而是由 github 或外部服务触发。
  • 在更新时将历史记录从“allpackages”迁移到相应的子存储库

任何关于从哪里开始研究的指导将不胜感激。提前致谢!

编辑:

@VonC 建议使用子模块,并使用git submodule foreach --recursive

优点:

  • Dry - 每个子模块的代码都在一个地方。
  • 能够跟踪父中子模块的更改。
  • 使用git submodule foreach --recursive别名允许单个提交到多个子模块

缺点:

  • 查看对子模块所做的更改并不是很清楚。必须深入研究子模块以查看进行了哪些更改。
  • 使用git submodule foreach --recursive起来很麻烦,而且不像常规提交那样优雅。

对于这个特定的用例。例如,“包”存储库github.com/example/example1将在某种意义上被读取。我不会直接推给他们。他们只会在更新时收到allpackages更新。需要创建它们的唯一原因是因为使用它们的包管理器需要为每个包单独的存储库。

4

3 回答 3

3

如果您将所有exampleX文件夹声明为 git repos,并将它们设为父 repos 的子模块allpackages,则:

  • 每个repo 都可以在 GitHub 上exampleX拥有自己的上游 repo

  • 自 git 1.7.11 起),您可以将所有内容推送到各自的仓库

    cd allpackages
    git push --recurse-submodules=on-demand
    

一个命令,一切都被推送。

于 2013-10-06T08:16:35.270 回答
2

Github won't run repo hooks. Setting up a github proxy repo with a post-update hook that adapts the auto-tracking in this answer and then forwards the pushes will, as I read it, satisfy the stated requirements.

That said, though, I'm with VonC. If you don't go with submodules you're going to be stuck with something like that -- and really, it's nothing more than fragile, crippled, stealth submodules that only work for that one repo, guaranteed to break as soon as someone pushes anywhere but to that proxy. It can be very convenient for your own work, in a private repo, and there are ways to kick the fragility one step farther down the road, but for a shared discipline it's not nearly robust enough.

For shared work I'll bet you wind up sooner or later switching to submodules anyway, and discovering they're not very mysterious. So ignore this and accept VonC's answer :-)

于 2013-10-08T20:43:49.547 回答
1

我仍然更喜欢我之前推荐的干净的“子模块”方法

但是,另一种将存储库的一个文件夹推入独立上游存储库的更骇人听闻的方法是使用嵌套存储库技术:

cd myrepos
git clone https://github.com/example/example1
git clone https://github.com/example/allpackages
cd allpackages/packages/example-1
git --git-dir=../../../example1/.git add .
git --git-dir=../../../example1/.git commit -m "commit for example1"
git --git-dir=../../../example1/.git push

这将考虑,对于 example1 GitHub 存储库,allpackages/packages/example-1:的工作树--git-dir 使 Git 认为这allpackages/packages/example-1是它自己的(嵌套)git 存储库,远程 ' origin' 指的是 GitHub。

但是:这将意味着 3 个不同的推送命令,除非您将这些命令包装在脚本中并通过 git 别名调用该脚本

git config alias.pushall '!sh pushall.sh'
于 2013-10-07T20:53:07.503 回答