Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/davidb/git-find

A tool (cli & lib) to find local git repositories.
https://github.com/davidb/git-find

Last synced: about 2 months ago
JSON representation

A tool (cli & lib) to find local git repositories.

Awesome Lists containing this project

README

        

# git-find

[![crates license](https://img.shields.io/crates/l/git-find.svg)](http://creativecommons.org/publicdomain/zero/1.0/)
[![crate version](https://img.shields.io/crates/v/git-find.svg)](https://crates.io/crates/git-find)

[![Actions Status](https://github.com/davidB/git-find/workflows/ci-flow/badge.svg)](https://github.com/davidB/git-find/actions)
[![Documentation](https://docs.rs/git-find/badge.svg)](https://docs.rs/git-find/)

[![crates download](https://img.shields.io/crates/d/git-find.svg)](https://crates.io/crates/git-find)
![GitHub All Releases](https://img.shields.io/github/downloads/git-find/git-find/total.svg)

A tool (cli & lib) to find and broadcast commands on local git repositories.

- [Why](#why)
- [Usage Cli](#usage-cli)
- [Template format](#template-format)
- [Possibles values](#possibles-values)
- [For scripting](#for-scripting)
- [Samples](#samples)
- [Install](#install)
- [From cargo](#from-cargo)
- [From binaries](#from-binaries)
- [From source](#from-source)
- [Related and similar](#related-and-similar)
- [Informations](#informations)
- [Actions (broadcast)](#actions-broadcast)
- [TODO](#todo)

## Why

Because I need a tool to list and to reorg my local git repositories.

## Usage Cli

```sh
$> git find -h
git-find 0.5.0
davidB
A tool (cli & lib) to find local git repositories.

USAGE:
git-find [FLAGS] [OPTIONS] [DIR]

FLAGS:
-h, --help Prints help information
-V, --version Prints version information
-v, --verbose Verbose mode (-v, -vv, -vvv, etc.) print on stderr

OPTIONS:
-t, --tmpl format of the output print on stdout [default: {{with .working_paths}}{{if
.conflicted}}C{{else}} {{end}}{{if .modified}}M{{else}}{{if .added}}M{{else}}{{if
.deleted}}M{{else}}{{if .renamed}}M{{else}} {{end}}{{end}}{{end}}{{end}}{{if
.untracked}}U{{else}} {{end}}{{end}} {{ .path.file_name }} {{ .path.full }} {{with
.remotes.origin}} {{ .name }} {{.url_full}} {{end}}]

ARGS:
root directory of the search [default: .]
```

- sample output with default template (M : Modification uncommitted, U: Untracked)

```sh
$> git-find .
sbt-scalabuff /home/dwayne/src/github.com/sbt/sbt-scalabuff origin https://github.com/sbt/sbt-scalabuff.git
MU ML /home/dwayne/src/github.com/samynk/ML origin https://github.com/samynk/ML.git
BlenderSourceTools /home/dwayne/src/github.com/Artfunkel/BlenderSourceTools origin [email protected]:Artfunkel/BlenderSourceTools.git
three.js /home/dwayne/src/github.com/mrdoob/three.js origin [email protected]:mrdoob/three.js.git
MU Yadef /home/dwayne/src/github.com/zzuegg/Yadef origin [email protected]:zzuegg/Yadef.git
MU dmonkey /home/dwayne/src/github.com/kwando/dmonkey origin https://github.com/kwando/dmonkey.git
MU getdown /home/dwayne/src/github.com/threerings/getdown origin https://github.com/threerings/getdown.git
dart-protoc-plugin /home/dwayne/src/github.com/dart-lang/dart-protoc-plugin origin [email protected]:dart-lang/dart-protoc-plugin.git
M vdrones /home/dwayne/src/github.com/davidB/vdrones origin [email protected]:davidB/vdrones.git
shader_editor /home/dwayne/src/github.com/davidB/shader_editor origin [email protected]:davidB/shader_editor.git
scala-maven-plugin /home/dwayne/src/github.com/davidB/scala-maven-plugin origin [email protected]:davidB/scala-maven-plugin.git
simpleaudio /home/dwayne/src/github.com/davidB/simpleaudio origin [email protected]:davidB/simpleaudio.git
MU ld31_p0cm0n /home/dwayne/src/github.com/davidB/ld31_p0cm0n origin [email protected]:davidB/ld31_p0cm0n.git
livereload-jvm /home/dwayne/src/github.com/davidB/livereload-jvm origin [email protected]:davidB/livereload-jvm.git
dart-protobuf /home/dwayne/src/github.com/davidB/dart-protobuf origin [email protected]:davidB/dart-protobuf.git
U jme3_skel /home/dwayne/src/github.com/davidB/jme3_skel origin [email protected]:davidB/jme3_skel.git
asset_pack /home/dwayne/src/github.com/davidB/asset_pack origin [email protected]:davidB/asset_pack.git
git-find /home/dwayne/src/github.com/davidB/git-find origin [email protected]:davidB/git-find.git
jme3_ext_assettools /home/dwayne/src/github.com/davidB/jme3_ext_assettools origin [email protected]:davidB/jme3_ext_assettools.git
...
```

- broadcast `git status` to every repositories

```sh
git find -t 'cd {{ .path.full }}; echo "\n\n----\n$PWD"; git status' | sh
```

- clean git repository (to free space)

```sh
git find -t 'cd {{ .path.full }} && git clean -d -X -f' | sh
```

### Template format

The template format is a subset of [golang text/template](https://golang.org/pkg/text/template/).

#### Possibles values

*!! Experimental: values could change with future release !!*

- .path
- .file_name
- .full
- .remotes
- . : eg 'origin'
- .name
- .url_full
- .url_host
- .url_path
- .working_paths
- .conflicted : list of path
- .modified : list of path
- .added : list of path
- .deleted : list of path
- .renamed : list of path
- .untracked : list of path

#### For scripting

1. Use explicit template within your script (the default template could change with each release)
1. If the template is a shell script (the tips could be used with every interpreter: python, ruby, ...), then you can

```sh
# run it directly
git find -t '...' | sh

# generate a script and run it later (maybe after review)
git find -t '...' > myscript.sh
sh myscript.sh

```

#### Samples

- to list local repository

```tmpl
{{ .path.file_name }}\t{{ .path.full }}
```

- to list local repository with origin url

```tmpl
{{ .path.file_name }}\t{{ .path.full }}\t{{with .remotes.origin}} {{ .name }} {{.url_full}} {{.url_host}} {{.url_path}} {{end}}
````

- to create a sh script to "git fetch" on every repository

```tmpl
cd {{ .path.full }}; echo "\n\n---------------------------------------------\n$PWD"; git fetch
```

- to create a sh script to move git repository under $HOME/src (same layout as go workspace)

```tmpl
echo "\n\n---------------------------------------------\n"
PRJ_SRC="{{ .path.full }}"
{{if .remotes.origin}}
PRJ_DST="$HOME/src/{{ .remotes.origin.url_host }}/{{ .remotes.origin.url_path}}"
{{else}}
PRJ_DST=$HOME/src/_local_/{{ .path.file_name}}
{{end}}
if [ ! -d "$PRJ_DST" ] ; then
read -p "move $PRJ_SRC to $PRJ_DST ?" answer
case $answer in
[yY]* )
mkdir -p $(dirname "$PRJ_DST")
mv "$PRJ_SRC" "$PRJ_DST"
;;
* ) ;;
esac
fi
```

- to list repo with some info (the default template of version 0.4.1)

```tmpl
{{with .working_paths}}{{if .conflicted}}C{{else}} {{end}}{{if .modified}}M{{else}}{{if .added}}M{{else}}{{if .deleted}}M{{else}}{{if .renamed}}M{{else}} {{end}}{{end}}{{end}}{{end}}{{if .untracked}}U{{else}} {{end}}{{end}}\t{{ .path.file_name }}\t{{ .path.full }}\t{{with .remotes.origin}} {{ .name }} {{.url_full}} {{end}}
```

## Install

### From cargo

With Rust's package manager [cargo](https://github.com/rust-lang/cargo), you can install via:

```sh
cargo install git-find
```

Note that rust version *1.26.0* or later is required.

### From binaries

*!! Experimental !!*

The [release page](https://github.com/davidb/git-find/releases) includes precompiled binaries for Linux, macOS and Windows.

- download archives for your OS
- unarchive it, and move the executable into the PATH

```sh
tar -xzvf git-find_0.3.2-x86_64-unknown-linux-gnu.tar.gz
chmod a+x git-find
mv git-find $HOME/bin
rm git-find_0.2.2-linux.tar.gz
```

### From source

```sh
git clone https://github.com/davidB/git-find

# Build
cd git-find
cargo build

# Run unit tests and integration tests
cargo test

# Install
cargo install
```

## Related and similar

Some tools to help management of multi repository
But not the same features, else no need to re-do.

### Informations

- [peap/git-global: Keep track of all your git repositories.](https://github.com/peap/git-global) (I quickly look at the source to estimate my contribution to add features, but the "potentials" changes are too many and could change the goal usage of the tool)
- [totten/git-scan: CLI tool for scanning/updating git repos](https://github.com/totten/git-scan/)
- [fboender/multi-git-status: Show uncommitted, untracked and unpushed changes for multiple Git repos](https://github.com/fboender/multi-git-status)

### Actions (broadcast)

- [gr - A tool for managing multiple git repositories](http://mixu.net/gr/)
- [mu-repo](http://fabioz.github.io/mu-repo/), Tool to help working with multiple git repositories (short for Multiple Repositories).
- [mr](http://myrepos.branchable.com/) which is a tool to manage all your version control repositories.
- [Repo command reference | Android Open Source Project](https://source.android.com/setup/develop/repo)
- [jiri - Git at Google](https://fuchsia.googlesource.com/jiri/)
- [mateodelnorte/meta](https://github.com/mateodelnorte/meta) tool for turning many repos into a meta repo. why choose many repos or a monolithic repo, when you can have both with a meta repo?
- [nosarthur/gita: Manage multiple git repos side by side for sanity](https://github.com/nosarthur/gita)

## TODO

- find a rust template engine that support calling method (getter) on current field (or contribute to gtmpl as it's a feature of go template)
- internally use stream / queue instead of Vector
- build linux binary with musl (see [rust-musl-builder](https://github.com/emk/rust-musl-builder))
- optimize