GitHunt
MV

mvz/git-subrepo-ng

Experimental re-implementation of git-subrepo in Ruby with Rugged

Subrepo

An experimental clone of git subrepo, to be extended with improvements.

NOTE: I'm not working on this anymore. It was an interesting experiment but
there are too many edge cases to get right. For my Ruby projects, I've switched
to specifiying git dependencies in the Gemfile. Git submodules are another good
option.

Installation

Add this line to your application's Gemfile:

gem 'subrepo'

And then execute:

$ bundle

Or install it yourself as:

$ gem install subrepo

Usage

Summary:

git subrepo init subdir --remote remote --branch branch
git subrepo push subdir
git subrepo fetch subdir
git subrepo pull subdir
git subrepo commit subdir

What Does This Do?

This is an experimental re-implementation of
git-subrepo, with the following goals:

  • Keep as much history as reasonably possible, both when pushing and pulling.
    In particular, do not squash history when pulling subrepo changes back into
    the main repo
  • Be performant
  • Have nicer generated commit messages

Initializing an Existing Directory As a Subrepo

git subrepo init subdir --remote <remote> --branch <branch>

Sets up configuration for handling the given subdirectory as a subrepo. A
remote repository to push to and pull from, as well as the remote branch to
use, must be provided.

This sets up a .gitrepo in the subdirectory with inital settings, and commits
it.

First Push

git subrepo push subdir [--remote <remote>] [--branch <branch>]

Rewrites the history for the subrepo to a new branch, then pushes that
branch to the remote.

The .gitrepo file is not pushed to the remote.

The last commit of the pushed history and the last commit of the original
history are both recorded in the .gitrepo file.

Subsequent Pushes

git subrepo push subdir [--remote <remote>] [--branch <branch>]

Rewrites the new part of the history of the subrepo to a new branch, then
pushes that to the remote.

The last commit of the pushed history and the last commit of the original
history are both recorded in the .gitrepo file.

It is highly recommended to specify a different branch to push to, so that the
pushed changes can be turned into a pull request or checked in other ways
before merging into the master branch.

Pulling Changes From Upstream

git subrepo pull subdir [--remote <remote>]

Fetches commits from the remote and rewrites them as part of the history of the
subrepo.

The last fetched commit is recorded in the .gitrepo file.

Status of This Project

This code is experimental. Try at your own risk. Implementation of subrepo
functionality is incomplete. In particular, it is not yet possible to clone a
remote into a new subrepo.

Caveats

Because git-subrepo-ng stores commit shas for fetched and pushed commits in the
.gitrepo file, you should be careful when rebasing branches. In particular,
you should pull from the remote's main development branch, and push from the
main repository's main development branch.

Development

After checking out the repo, run script/setup to install dependencies. Then,
run rake spec to run the tests. You can also run script/console for an
interactive prompt that will allow you to experiment.

To install this gem onto your local machine, run bundle exec rake install. To
release a new version, update the version number in version.rb, and then run
bundle exec rake release, which will create a git tag for the version, push
git commits and tags, and push the .gem file to
rubygems.org.

Contributing

Bug reports and pull requests are welcome on GitHub at
https://github.com/mvz/subrepo. This project is intended to be a safe,
welcoming space for collaboration, and contributors are expected to adhere to
the Contributor Covenant code of conduct.

License

Copyright © 2019-2020 Matijs van Zuijlen

This is free software, distributed under the terms of the GNU General Public
License, version 3.0 or later. See the file COPYING for more information.

The test suite in test/ is based on the test suite of git-subrepo, which is
licensed under the MIT License and copyright © 2013-2020 Ingy döt Net.

Code of Conduct

Everyone interacting in the Subrepo project’s codebases, issue trackers, chat
rooms and mailing lists is expected to follow the
code of conduct.

Languages

Shell43.5%Ruby31.1%Gherkin13.4%Roff10.6%Makefile1.5%

Contributors

GNU General Public License v3.0
Created December 18, 2019
Updated June 15, 2025
mvz/git-subrepo-ng | GitHunt