- Features: extension for
gitto manage multiple repositories or git submodules. - Blazing-fast command line application written in
Javaand built on top of latest technologies:native imagefrom GraalVM to compile into machine code and run without JVM or JDK.- Java 21's Virtual Threads: lightweight threads that reduce the effort of writing, maintaining, and debugging high-throughput concurrent applications.
- Easy to use:
- The app is completely bundled into a standalone executable file, no extra dependencies needed.
- Add
.gis-modulesfile if you need to manage multiple repos (not git submodules) - Run
gis -horgis <commands> -hfor help
(require docker/podman to build)
There are 2 GraalVM distributions: GraalVM CE and Mandrel. Since this app is written in Java completely, Mandrel is prefered.
cd gis
podman build -t gis . || return 1; podman create --name dkgis_ gis:latest; podman cp dkgis_:/app/gis/gis .; podman rm -f dkgis_After the steps above, an executable file named gis will be created under project directory.
podman build -t gis https://github.com/nqminhuit/gis.git
podman create --name gis_ gis:latest
podman cp gis_:/app/gis/gis .
podman rm -f gis_Testcontainers can run from inside a container by following the official "docker wormhole" pattern: mount the project directory at the same path inside the test container and also mount a Docker-compatible socket. This repository wraps that setup in Make targets so contributors can reuse the same containerized workflow locally and in CI-like environments.
make test-in-container-dockersystemctl --user enable --now podman.socket
make test-in-container-podmanmake test-in-container CONTAINER_RUNTIME=podman MAVEN_ARGS="-Dtest=GisIntTest verify"Notes:
- The Make target mounts the source tree at the current working directory, mounts the container socket at
/var/run/docker.sock, and runsmvn clean verifyinside a Maven 21 container. - For Docker Desktop, export
TESTCONTAINERS_HOST_OVERRIDE=host.docker.internalbefore running the Make target. - For rootless Podman, the Make target disables
Ryuk, which matches Testcontainers' Podman guidance.
cd gis
mvn clean verify packageThe executable jar file will be created at target/gis-<version>.jar
java -agentlib:jdwp=transport=dt_socket,address=9999,server=y,suspend=n -jar path/to/gis-<version>.jar
For more details, just run:
./gis --helpGenerate completion for zsh:
./gis completion --directory ${fpath[1]}
Reload your zsh session, we can now press <TAB> for autocomplete.
Currently gis only support zsh for completion.
Run gis fe -q to start git fetch for the root repository and every configured module in the background, then exit immediately without waiting for fetch results.
Gis will read config from file at ~/.config/gis.config
Supported configs:
| key | description | default value |
|-------------------------+---------------------------------------------------------+---------------------|
| default_branches | comma separated values indicate default branch values | master,main,develop |
| feature_branch_prefixes | comma separated values indicate feature branch prefixes | feature/ |
| dont_care_files | comma separated root-level files shown in faint gray | |
Note: do NOT insert space into value part.
Don't:
master, main, develop
Do:
master,main,develop
example:
default_branches=master,main,develop
feature_branch_prefixes=feature/
dont_care_files=.editorconfig,.gitmodules,launch.json,pom.xml
The reason that value parsing is not that smart is because that we use default Java core package java.util.Properties to parse values. We prefer Java's core over extra dependencies.
notes:
git submodulecommands do not take the root module into account, howevergisdoes.- the data was generated on the same repository, same machine.
command for generating the above numbers:
for i in {1..1000}; do { time git submodule foreach git status -sb --ignore-submodules; } 2>> git_st_report done
# took 28s638ms in total
for i in {1..1000}; do { time gis st; } 2>> gis_st_report done
# took 13s654ms in totalcommand for generating the above numbers:
for i in {1..100}; do { time git submodule foreach git fetch; } 2>> git_fe_report done
# took 29m43s442ms
for i in {1..100}; do { time gis fe; } 2>> gis_fe_report done
# took 5m11s832msUse Sonarqube to analyze code:
podman run -d --name sonarqube -e SONAR_ES_BOOTSTRAP_CHECKS_DISABLE=true -p 9876:9000 docker.io/sonarqube:9.9.5-communityThen go to http://localhost:9876
- login (admin/admin), then change your password
- go to
http://localhost:9876/projectsand click "Add a project" - choose "Manually"
- input "Project key" and "Display name" e.g., "gis" then click "Set Up"
- "Generate a token": enter a name for this token then click "Generate"
- you will get something like this: 302481a5dee289283af983ac713174e2f2ed13da. Click "Continue"
- as shown in the 2nd step, with maven:
mvn sonar:sonar -Dsonar.projectKey=gis -Dsonar.host.url=http://localhost:9876 -Dsonar.login=302481a5dee289283af983ac713174e2f2ed13da
- after the maven command above succcess, you will have a dashboard about
gisproject
Performed automatically at: https://github.com/nqminhuit/gis-stress-test when:
- any changes to gis master branch: will perform stress test on small dataset
- when gis publishes a new release: will perform stress test on both small and large dataset