Do you have a gigantic sprawling mess of git repositories that you care about? Do you need to manage that sprawl on multiple machines? Need to set up your list of repos on a new machine?
This utility helps you to manage that mess.
- Quickly sync all your git repos or just a subset of your repos with a single command. The tool decides whether to do a 'git clone' or a 'git pull'
- Use a config file to define all the git repos you care about
- Take your existing mess of git repos and script it all into a config file
- Define categories of git repos in the config file
- Mark git repos as a 'quick sync' repository
- Quickly sync all your 'quick sync' repos
- Quickly sync just a category of repos
Written by Benjamin Day
Pluralsight Author | Microsoft MVP | Scrum.org Professional Scrum Trainer
https://www.benday.com
info@benday.com
Got ideas for git repo sync features you'd like to see? Found a bug? Let us know by submitting an issue https://github.com/benday-inc/git-repo-sync/issues. Want to contribute? Submit a pull request.
The gitreposync is distributed as a .NET Core Tool via NuGet. To install it go to the command prompt and type
dotnet tool install gitreposync -g
- You'll need to install .NET Core 7 from https://dotnet.microsoft.com/
Everything starts with a configuration. After you've installed gitreposync, you'll need to
run gitreposync addconfig
to add a configuration. Each configuration has a list of git repositories and a source code directory.
Configurations are named and you can have as many as you'd like.
I think you're going to want to use your repo config file (aka. your list of repositories) across multiple machines. My suggestion is that you create that file in a directory that's synced to a cloud storage provider like OneDrive or Dropbox.
This tool is meant to be usable across OS platforms. The directory path where you store your source code is going to be completely different if you're working on Windows, Mac, or Linux -- but the list of git repositories that you care about is probably the same.
My guess is that you'll put your config file into a cloud storage provider like OneDrive or Dropbox.
When you add a git repository to the configuration, the source code directory value for that repo gets replaced with a
variable ('%%CODE_DIR%%'). When you do a gitreposync update
, the local version of the code directory is automatically set into that code dir variable so that you can share a repo config file across multiple machines and operating systems
without having to change your config file.
There's one default configuration named (default)
. If you only care about one list of git repositories, then all you'll need to do is to run gitreposync addconfig /codedir:c:\code /filename:c:\onedrive\gitreposync\gitreposync.csv
and that will set your default configuration. Done.
If you want to add additional named configurations, you'll run gitreposync addconfig /config:{name} ...
.
Once you've set a default configuration, you can run any gitreposync command without having to specify any additional URL or PAT info.
If you want to run a command against a different list of git repo configs that is NOT your default, you'll need to supply the /config:{name}
.
To add new configurations or modify an existing configuration, use the gitreposync addconfig
command. You can list your configurations using the gitreposync listconfig
command. To delete a configuration, use the gitreposync removeconfig
command.
Once you've run gitreposync addconfig
and set up your config file path, you can start adding repositories to your config.
You can either do that one repo at a time using gitreposync addrepo
or in bulk.
This is the easiest way to get going. Open a terminal (aka. command prompt) window and cd
to your git repo directory.
Let's say that your git repository is in c:\code\my-git-repo
. Once you've done cd \code\my-git-repo
, you can run
gitreposync addrepo
and the tool will automatically add that repo to the config.
There are additional options such as quick sync and category that you also might want to configure. The addrepo
command
can be run multiple times and it will update the config for your repo.
To view the additional options, run gitreposync addrepo --help
.
If you're scripting a lot of git repositories that are already on disk, you can run gitreposync exportconfig
. This command
will look at all the child directories under your current directory and export the repo config in comma-separated value (CSV)
format. The CSV data is printed to the console -- it does NOT actually update your repo config file. Put another way, you'll
need to manually copy the CSV data into your repo config file.
To open your repo config file run gitreposync openconfig
. That command probably opens the repo config file in a text editor but you might find that it's helpful to open that config file in Excel.
Once you have your repository config file set up, you can start bringing down your code. To do this, you'll run gitreposync update
.
That command will perform either a git clone or a git pull to make sure that you have the latest code on your machine.
There are probably some repositories that you work with all the time and that have frequent changes.
You can mark a configured git repository as a 'quick sync' repository using gitreposync addrepo /quicksync
.
To update just your quick sync repositories, run gitreposync quicksync
You can also organize your repositories by category. You can set the category for a repository using gitreposync addrepo /category:{category-name}
.
To update just your quick sync repositories, run gitreposync update /category:{category-name}
FYI, the category filter matches by the exact category name, not the partial category name.
Sometimes you want to update repositories by name. To do this, you can specify a filter.
To update your git repositories using a filter, run gitreposync update /filter:{value}
. It will search the configured
git repositories and clone/pull anything that contains the filter value in the name, category, or URL.
Yes, you can combine these filters and options.
Feeling impatient? Don't care that the messages displayed in the tool might be kind of a mess? Try running gitreposync update /parallel
to run the update command in multi-threaded mode. I guarantee that the displayed messages will be a complete mess...but since it runs
using multiple cores/processors, it'll probably run a bit faster.
Command Name | Description |
---|---|
addconfig | Add or update a git repo sync configuration. A git repo sync configuration is the list of repositories you care about plus your local code directory. |
addrepo | Add or update a repo to the list of configured repositories. NOTE: Repository URL is the unique identifier |
exportconfig | Reads existing Git repositories and outputs configuration information to config file. |
info | Gets the configuration info for the current repo |
listconfig | List a your git repo sync configurations. A git repo sync configuration is the list of repositories you care about plus your local code directory. |
listcategories | Lists the repository categories in the config file. |
listrepos | Reads config file and lists the configured repositories. |
openconfig | Open the repo configuration file in the default text editor |
quicksync | Performs a update on all quick sync repos. EXPERIMENTAL: runs the repo synchronizations in parallel. It runs a lot faster but the messages written to the console WILL definitely be a mess. |
removeconfig | Remove a git repo sync configuration. A git repo sync configuration is the list of repositories you care about plus your local code directory. |
removerepo | Remove a repo from the list of configured repositories. NOTE: Repository URL is the unique identifier |
update | Performs a 'git clone' or 'git pull' for each configured git repository. |
Add or update a git repo sync configuration. A git repo sync configuration is the list of repositories you care about plus your local code directory.
Argument | Is Optional | Data Type | Description |
---|---|---|---|
config | Optional | String | Name of the configuration |
filename | Required | String | Configuration file path |
codedir | Required | String | Code directory value. Note: this is used as the code variable value '%%CodeDir%%' in your config file. |
Add or update a repo to the list of configured repositories. NOTE: Repository URL is the unique identifier
Argument | Is Optional | Data Type | Description |
---|---|---|---|
config | Optional | String | Configuration name to use |
name | Optional | String | Human readable name for the repository |
parentdir | Optional | String | Parent directory for this repository. Essentially, where do you want this on disk? |
quicksync | Optional | Boolean | Add repo to quick sync |
overwrite | Optional | Boolean | Overwrites an existing repo config |
category | Optional | String | Category for the repository |
url | Optional | String | Repository URL value. NOTE: If not supplied, the repo URL for the current directory is used |
Reads existing Git repositories and outputs configuration information to config file.
Argument | Is Optional | Data Type | Description |
---|---|---|---|
frompath | Required | String | Starting path for search. NOTE: this only checks immediate child directories. |
codefolderpath | Required | String | Path for code directory. This becomes a variable in the config file. |
category | Required | String | Category name for this group of git repositories. |
filename | Optional | String | Writes configuration to file name |
Gets the configuration info for the current repo
Argument | Is Optional | Data Type | Description |
---|---|---|---|
config | Optional | String | Configuration name to use |
List a your git repo sync configurations. A git repo sync configuration is the list of repositories you care about plus your local code directory.
Argument | Is Optional | Data Type | Description |
---|---|---|---|
config | Optional | String | Name of the configuration |
Lists the repository categories in the config file.
Argument | Is Optional | Data Type | Description |
---|---|---|---|
config | Optional | String | Configuration name to use |
Reads config file and lists the configured repositories.
Argument | Is Optional | Data Type | Description |
---|---|---|---|
config | Optional | String | Configuration name to use |
filter | Optional | String | Filter repos by partial string value |
category | Optional | String | Filter repos by category value. NOTE: this matches by full string |
quicksync | Optional | Boolean | Filter repos by 'quick sync' value |
Open the repo configuration file in the default text editor
Argument | Is Optional | Data Type | Description |
---|---|---|---|
config | Optional | String | Configuration name to use |
Performs a update on all quick sync repos. EXPERIMENTAL: runs the repo synchronizations in parallel. It runs a lot faster but the messages written to the console WILL definitely be a mess.
Argument | Is Optional | Data Type | Description |
---|---|---|---|
config | Optional | String | Configuration name to use |
singlethread | Optional | Boolean | Runs the repo update operations single threaded. This turns off the experimental feature of running multithreaded. Running single threaded will fix the messed up message display. |
Remove a git repo sync configuration. A git repo sync configuration is the list of repositories you care about plus your local code directory.
Argument | Is Optional | Data Type | Description |
---|---|---|---|
config | Required | String | Name of the configuration |
Remove a repo from the list of configured repositories. NOTE: Repository URL is the unique identifier
Argument | Is Optional | Data Type | Description |
---|---|---|---|
config | Optional | String | Configuration name to use |
url | Optional | String | Repository URL value. NOTE: If not supplied, the repo URL for the current directory is used |
Performs a 'git clone' or 'git pull' for each configured git repository.
Argument | Is Optional | Data Type | Description |
---|---|---|---|
config | Optional | String | Configuration name to use |
filter | Optional | String | Filter repos by partial string value |
category | Optional | String | Filter repos by category value. NOTE: this matches by full string |
quicksync | Optional | Boolean | Filter repos by 'quick sync' value |
parallel | Optional | Boolean | EXPERIMENTAL: runs the repo synchronizations in parallel. It runs a lot faster but the messages written to the console WILL definitely be a mess. |