Compare commits

..

No commits in common. "main" and "7.0.0" have entirely different histories.
main ... 7.0.0

200 changed files with 2442 additions and 6795 deletions

View file

@ -17,14 +17,3 @@ trim_trailing_whitespace = false
[*.html] [*.html]
trim_trailing_whitespace = false trim_trailing_whitespace = false
[*.py]
indent_size = 4
[*.bats]
indent_style = tab
indent_size = 4
[tests/*.sh]
indent_style = tab
indent_size = 4

View file

@ -1,2 +0,0 @@
gool
Cant

View file

@ -1,12 +0,0 @@
<!--
Note
* Mark the PR as draft until it's ready to be reviewed.
* Please update the documentation to reflect the changes made in the PR.
* If the command is covered by tests under ./tests, please add/update tests for any changes unless you have a good reason.
* Make a new commit to resolve conversations instead of `push -f`.
* To resolve merge conflicts, merge from the `main` branch instead of rebasing over `main`.
* Please wait for the reviewer to mark a conversation as resolved.
-->

View file

@ -1,6 +0,0 @@
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"

View file

@ -1,112 +1,46 @@
name: ci name: ci
on: on:
push: push:
branches: [main] branches: [master]
pull_request: pull_request:
branches: [main] branches: [master]
jobs: jobs:
lint: lint:
runs-on: ubuntu-latest runs-on: 'ubuntu-22.04'
steps: steps:
- name: Check out code.
uses: actions/checkout@v7
with:
fetch-depth: 0
- name: 'Get Changed Files' - name: 'Get Changed Files'
id: 'files' id: 'files'
run: | uses: 'masesgroup/retrieve-changed-files@v2'
CHANGED_FILES=$(git diff --name-only "${BASE_SHA:-$BEFORE_SHA}...${HEAD_SHA:-$GITHUB_REF}")
echo "::notice::Changed files: $CHANGED_FILES"
{
echo "added_modified<<EOF"
echo "$CHANGED_FILES"
echo "EOF"
} >> "$GITHUB_OUTPUT"
env:
BASE_SHA: ${{ github.event.pull_request.base.sha }}
HEAD_SHA: ${{ github.event.pull_request.head.sha }}
BEFORE_SHA: "${{ github.event.before }}"
- name: 'Check Generated Manuals'
run: |
failed=0
while IFS= read -r source; do
case "$source" in
man/git-*.md)
stem=${source%.md}
for generated in "$stem.1" "$stem.html"; do
if ! grep -Fqx -- "$generated" <<< "$CHANGED_FILES"; then
echo "::error file=$source::$generated must be updated with $source"
failed=1
fi
done
;;
esac
done <<< "$CHANGED_FILES"
exit "$failed"
env:
CHANGED_FILES: "${{ steps.files.outputs.added_modified }}"
- uses: 'actions/setup-go@v7'
with: with:
go-version: '1.20' format: 'json'
- name: 'Install EditorConfig Lint'
run: go install 'github.com/editorconfig-checker/editorconfig-checker/cmd/editorconfig-checker@latest'
- name: 'Check EditorConfig Lint'
run: echo "$FILES" | xargs ~/go/bin/editorconfig-checker
env:
# NOTE: use env to pass the output in order to avoid possible injection attacks
FILES: "${{ steps.files.outputs.added_modified }}"
- name: checkstyle
run: ./scripts/checkstyle.py
- name: Shellcheck
run: shellcheck --severity=error bin/* ./*.sh
typo:
runs-on: ubuntu-latest
steps:
- name: Check out code. - name: Check out code.
uses: actions/checkout@v7 uses: actions/checkout@v2
- name: Install codespell - name: 'Check EditorConfig Lint'
run: python3 -m pip install codespell==2.4
- name: spell check
run: | run: |
git grep --cached -l '' . | \ sudo apt install -y jq golang
grep -v -e 'History\.md' -e 'AUTHORS' -e 'man/.*\.1' -e 'man/.*\.html' | \ go install 'github.com/editorconfig-checker/editorconfig-checker/cmd/editorconfig-checker@latest'
xargs codespell --ignore-words=.github/.ignore_words
test-bats: readarray -t changed_files <<<"$(jq -r '.[]' <<<'${{ steps.files.outputs.added_modified }}')"
name: 'Test with Bats' ~/go/bin/editorconfig-checker ${changed_files[@]}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
with:
submodules: recursive
- name: Setup Bats
id: setup-bats
uses: bats-core/bats-action@4.0.0
with:
bats-version: 'v1.8.1'
- name: Test with Bats
env:
BATS_LIB_PATH: ${{ steps.setup-bats.outputs.lib-path }}
TERM: xterm
run: bats ./tests
build: build:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
platform: platform:
- ubuntu-latest - ubuntu-22.04
- macos-latest - macos-latest
runs-on: ${{ matrix.platform }} runs-on: ${{ matrix.platform }}
steps: steps:
- name: Check out code. - name: Check out code.
uses: actions/checkout@v7 uses: actions/checkout@v2
- name: Linux Install - name: Linux Install
if: matrix.platform == 'ubuntu-latest' if: matrix.platform == 'ubuntu-22.04'
run: sudo apt-get install -y bsdmainutils run: |
sudo apt-get install -y bsdmainutils
- name: Script - name: Script
run: ./check_integrity.sh run: |
./check_integrity.sh $(find bin | cut -b 5- | xargs)
- name: Brew release - name: Brew release
if: matrix.platform == 'macos-latest' if: matrix.platform == 'macos-latest'
run: | run: |

View file

@ -1,18 +0,0 @@
name: "Maintenance: Close Stale PRs"
on:
schedule:
- cron: "30 1 * * *"
permissions:
pull-requests: "write"
jobs:
stale:
runs-on: "ubuntu-latest"
if: github.repository_owner == 'tj'
steps:
- uses: "actions/stale@v11"
with:
close-pr-message: "This PR was closed because it has been stalled for 365 days with no activity. Feel free to make a new PR if you wish to continue"
days-before-pr-stale: 350
days-before-pr-close: 15

3
.gitignore vendored
View file

@ -1,3 +0,0 @@
.venv/
__pycache__/
coverage/

3
.gitmodules vendored
View file

@ -1,3 +0,0 @@
[submodule "vendor/bats-all"]
path = vendor/bats-all
url = https://github.com/hyperupcall/bats-all

View file

@ -1,5 +0,0 @@
[pytest]
minversion = 7.4
addopts = -ra -q
testpaths = tests
faulthandler_timeout = 5

363
AUTHORS
View file

@ -1,14 +1,16 @@
git-extras is written and maintained by various contributors: git-extras is written and maintained by TJ Holowaychuk and
various contributors:
Development Lead
````````````````
- TJ Holowaychuk <tj@vision-media.ca>
Maintainers Maintainers
``````````` ```````````
- TJ Holowaychuk <tj@vision-media.ca>
- Hemanth.HM <hemanth.hm@gmail.com> - Hemanth.HM <hemanth.hm@gmail.com>
- Nimit Kalra <me@nimit.io> - Nimit Kalra <me@nimit.io>
- Nicolai Skogheim <nicolai.skogheim@gmail.com> - Nicolai Skogheim <nicolai.skogheim@gmail.com>
- spacewander <spacewanderlzx@gmail.com> - spacewander <spacewanderlzx@gmail.com>
- Edwin Kofler <edwin@kofler.dev>
- Leroy <vanpipy@gmail.com>
Patches and Suggestions Patches and Suggestions
``````````````````````` ```````````````````````
@ -21,231 +23,101 @@ Patches and Suggestions
- CJ - CJ
- Paul Wise - Paul Wise
- Damien Tardy-Panis - Damien Tardy-Panis
- Mark Eissler
- Yuriy VG - Yuriy VG
- Leila Muhtasib - Mark Eissler
- Richard Fearn - Richard Fearn
- Bill Wood - Leila Muhtasib
- Jesús Espino - Jesús Espino
- Rémy HUBSCHER
- go2null - go2null
- Bill Wood
- Rémy HUBSCHER
- Andrew Janke - Andrew Janke
- David Baumgold
- Jan Schulz
- Kenneth Reitz
- Mark Pitman
- Peter Benjamin - Peter Benjamin
- Günther Grill - Edwin Kofler
- Jan Schulz
- David Baumgold
- Mark Pitman
- Kenneth Reitz
- Luke Childs - Luke Childs
- Sasha Khamkov - Sasha Khamkov
- Günther Grill
- equt - equt
- oikarinen
- vyas - vyas
- Don Harper
- Pierre Ayoub
- Robin Winslow - Robin Winslow
- Ross Smith II
- Yi EungJun
- grindhold - grindhold
- wyattscarpenter - Don Harper
- Aggelos Orfanakos - Yi EungJun
- Camille Reynders
- Carlos Prado - Carlos Prado
- vanpipy
- Chris Hall - Chris Hall
- Damian Krzeminski
- NANRI - NANRI
- Alexander Krasnukhin - Camille Reynders
- Phally - Damian Krzeminski
- Rico Sta. Cruz - Aggelos Orfanakos
- Takuma Yamaguchi
- thomas menzel - thomas menzel
- vr8ce - vr8ce
- Brian J Brennan - Alexander Krasnukhin
- Dominik Gedon - Rico Sta. Cruz
- Hogan Long - Phally
- Ivan Malopinsky - Takuma Yamaguchi
- John Bachir
- Jonathan "Duke" Leto
- Julio Napurí
- Justin Dugger
- Nils Winkler
- Philipp Klose
- Raphael Boidol
- Richard Russon
- Sam Bostock
- Vladimir Jimenez
- gisphm - gisphm
- jacobherrington - jacobherrington
- Justin Dugger
- Hogan Long
- Jonathan "Duke" Leto
- Richard Russon
- overengineer - overengineer
- phigoro - phigoro
- Julio Napurí
- Sam Bostock
- Nils Winkler
- Philipp Klose
- wooorm - wooorm
- Alexis GRIMALDI - Brian J Brennan
- Allan Odgaard - Ivan Malopinsky
- Andre Cerqueira - Dominik Gedon
- Austin Ziegler - Vladimir Jimenez
- Beth Skurrie
- Brice Dutheil
- Curtis McEnroe
- Daniele Paolella
- David Rogers
- Devin Withers
- Domenico Rotiroti
- Evan Grim
- Florian H
- Gert Van Gool
- Guillaume Seren - Guillaume Seren
- Hozefa - Florian H
- Igor Ostapenko - Beth Skurrie
- Jean Jordaan - Evan Grim
- Joshua Li
- Justin Guenther
- Kylie McClain
- Marc Harter
- Matiss
- Nate Jones
- Newell Zhu
- Patryk Małek
- Paul Schreiber
- Richard Littauer
- Tjaart van der Walt - Tjaart van der Walt
- Justin Guenther
- Marc Harter
- Tom Vincent - Tom Vincent
- Allan Odgaard
- Matiss
- Wil Moore III - Wil Moore III
- William Montgomery - William Montgomery
- Hozefa
- Ye Lin Aung - Ye Lin Aung
- Alexis GRIMALDI
- Brice Dutheil
- Andre Cerqueira
- Domenico Rotiroti
- Nate Jones
- Joshua Li
- Newell Zhu
- luozexuan - luozexuan
- roxchgt - roxchgt
- David Rogers
- soffolk - soffolk
- 0xflotus - Richard Littauer
- Abdullah - Jean Jordaan
- Adam Parkin - Devin Withers
- Adriaan Zonnenberg - Patryk Małek
- Akim Demaille - Paul Schreiber
- Alessandro Pagiaro - Kylie McClain
- Alex McHale - Curtis McEnroe
- Aloxaf - Gert Van Gool
- Amir Tocker
- Ammar Najjar
- Amory Meltzer
- Andreas Duering
- Andrei Petcu
- Andrew Griffiths
- Andrew Marcinkevičius
- Andrew Starr-Bochicchio
- Andrew Sullivan Cant
- Andrey Elizarov
- Angel Aguilera
- Antoine Beaupré
- Aurélien Scoubeau
- Balazs Nadasdi
- Ben Parnell
- Beni Ben Zikry
- Brandon Zylstra
- Brian Goad
- Brian Murrell
- Bruno Sutic
- Caleb Maclennan
- Carl Casbolt
- Carlos Rodríguez
- Christophe Badoit
- Ciro Nunes
- CleanMachine1
- CodeByZach
- Craig MacGregor
- Dan Goodliffe
- Dan Jackson
- Dan Kilman
- Daniel Bruder
- Daniel Lublin
- Daniel Schildt
- Dave James Miller
- David Hartmann
- Dominic Barnes
- Dung Quang
- Edward Betts
- Eli Schwartz
- Emil Kjelsrud
- Erik Skultety
- François M
- George Crabtree
- Gerrit-K
- Greg Allen
- Guilhem Saurel
- Guillermo Rauch
- Gunnlaugur Thor Briem
- Hasse Ramlev Hansen
- Heiko Becker
- Hugo Ruiz-Mireles
- Isaac Mungai
- J.C. Yamokoski
- Jack O. Wasey
- James Manning
- James Zhu
- Jan Krueger
- Jared Baur
- Jarod Stewart
- Jason Young
- Jens K. Mueller
- Jeremy Lin
- Jesse Sipprell
- Jianjin Fan
- Jobin Kurian
- Johannes Ewald
- John Evans
- John Hoffmann
- Jon Ander Peñalba
- Josh McKinney
- Joshua Appelman
- José María Gutiérrez @TheTechOddBug
- Katrin Leinweber
- Kevin Woo
- Konstantin Schukraft
- Kurban Mallachiev
- Leandro López
- Lone
- Luis Miguel Hernanz
- Maarten Winter
- Marco Glasbergen
- Matan Rosenberg
- Mathieu D. (MatToufoutu)
- Matt
- Matt Colyer
- Matt Headley
- Matthew Avant
- Mattias Andersson
- Michael Komitee
- Michael Matuzak
- Michele Bologna
- Montak Oleg
- Moritz Grauel
- Nate Eagleson
- Nate Fischer
- Nathan Rajlich
- Nick Campbell
- Nick Payne
- Nicolas Kosinski
- Niklas Fiekas
- Oliver Kopp
- Orestis
- Peter Bittner
- Piotr Górski
- Prayag Verma
- Przemek Kitszel
- R. Martinho Fernandes
- Raphael Fleischlin
- Rasmus Wriedt Larsen
- René
- Revisor
- Ricardo Fernández Serrata
- Riceball LEE - Riceball LEE
- Rob Kennedy - Rob Kennedy
- Robin von Bülow - Robin von Bülow
- Russ
- Ryan Bohn - Ryan Bohn
- Sachin Gupta - Sachin Gupta
- Sam Thursfield - Sam Thursfield
- Sandro - Sandro
- Sascha Andres - Sascha Andres
- SchleimKeim
- Sean Molenaar - Sean Molenaar
- Sebastian Gniazdowski - Sebastian Gniazdowski
- Sebastián Mancilla - Sebastián Mancilla
@ -266,24 +138,19 @@ Patches and Suggestions
- Valérian Galliat - Valérian Galliat
- Vitaly Chikunov - Vitaly Chikunov
- Wei Lee - Wei Lee
- Wei Wu
- Wen Sun
- Wiktor Żurawik
- Xavier Krantz - Xavier Krantz
- Xiaopei Li - Xiaopei Li
- Zeeshan Ahmed - Zeeshan Ahmed
- ax1036 - ax1036
- brian murrell
- creynders - creynders
- dead-horse - dead-horse
- eszabpt - eszabpt
- fengkx - fengkx
- johnpyp
- jykntr - jykntr
- kang
- meza - meza
- neydroid - neydroid
- nulltask - nulltask
- phanium
- sgleizes - sgleizes
- tfendin - tfendin
- tiemonl - tiemonl
@ -294,3 +161,107 @@ Patches and Suggestions
- Étienne BERSAC - Étienne BERSAC
- ☃ pitr - ☃ pitr
- 单元源 - 单元源
- Przemek Kitszel
- Abdullah
- Adam Parkin
- Adriaan Zonnenberg
- Akim Demaille
- Alessandro Pagiaro
- Alex McHale
- Aloxaf
- Amir Tocker
- Ammar Najjar
- Amory Meltzer
- Andreas Duering
- Andrei Petcu
- Andrew Griffiths
- Andrew Marcinkevičius
- Andrew Starr-Bochicchio
- Andrey Elizarov
- Angel Aguilera
- Antoine Beaupré
- Aurélien Scoubeau
- Balazs Nadasdi
- Ben Parnell
- Beni Ben Zikry
- Brandon Zylstra
- Brian Goad
- Bruno Sutic
- Caleb Maclennan
- Carl Casbolt
- Carlos Rodríguez
- Christophe Badoit
- Ciro Nunes
- CleanMachine1
- Craig MacGregor
- Dan Jackson
- Dan Kilman
- Daniel Bruder
- Daniel Lublin
- Daniel Schildt
- Dave James Miller
- David Hartmann
- Dominic Barnes
- Dung Quang
- Edward Betts
- Eli Schwartz
- Emil Kjelsrud
- François M
- George Crabtree
- Greg Allen
- Guillermo Rauch
- Gunnlaugur Thor Briem
- Hasse Ramlev Hansen
- Heiko Becker
- Isaac Mungai
- J.C. Yamokoski
- Jack O. Wasey
- James Manning
- James Zhu
- Jan Krueger
- Jarod Stewart
- Jason Young
- Jens K. Mueller
- Jeremy Lin
- Jesse Sipprell
- Jianjin Fan
- Johannes Ewald
- John Evans
- John Hoffmann
- Jon Ander Peñalba
- Joshua Appelman
- José María Gutiérrez @TheTechOddBug
- Katrin Leinweber
- Kevin Woo
- Konstantin Schukraft
- Kurban Mallachiev
- Leandro López
- Lone
- Luis Miguel Hernanz
- Maarten Winter
- Marco Glasbergen
- Matan Rosenberg
- Mathieu D. (MatToufoutu)
- Matt
- Matt Colyer
- Matthew Avant
- Michael Komitee
- Michael Matuzak
- Michele Bologna
- Montak Oleg
- Moritz Grauel
- Nate Fischer
- Nathan Rajlich
- Nick Campbell
- Nick Payne
- Nicolas Kosinski
- Niklas Fiekas
- Oliver Kopp
- Orestis
- Peter Bittner
- Piotr Górski
- Prayag Verma
- 0xflotus
- R. Martinho Fernandes
- Raphael Fleischlin
- Rasmus Wriedt Larsen

View file

@ -1,22 +1,15 @@
# Contributing ## Your new git-extra command should support
Thanks for contributing! Please read this document before you make a PR. * OSX, Linux, BSD (You may need to browse their man page)<sup>*</sup>
* Bash 3.2+ (If you aren't sure, see [the Bash changelog](https://www.tldp.org/LDP/abs/html/bash2.html))
* Git 2.1+
## Supported Platforms <sup>*</sup>If you aren't able to test your new command on a platform,
make that clear in your PR and someone else may be able to test it on their system.
Any changes must support the following platforms: ## To submit a new command, you should
- macOS Let's assume your new command is named `foo`.
- Linux
- OpenBSD (You may need to browse their man page)
Your change must also be compatible with the dependency constraints that we specify in [Installation](./Installation.md). If you aren't sure if a feature is compatible, check the manual or release notes. For example, the Bash changelog is [here](https://git.savannah.gnu.org/cgit/bash.git/tree/NEWS?h=devel).
If you aren't able to test your new command on a platform, make that clear in your PR; someone else may be able to test it on their system.
## Adding a New Command
Let's say you wish to add a new command. Assuming your new command is named `foo`:
1. Write a bash script under `./bin` called `git-foo`. The script should be started with `#!/usr/bin/env bash`. 1. Write a bash script under `./bin` called `git-foo`. The script should be started with `#!/usr/bin/env bash`.
2. Read `./man/Readme.md` and write documentation for `git-foo`. 2. Read `./man/Readme.md` and write documentation for `git-foo`.
@ -24,11 +17,6 @@ Let's say you wish to add a new command. Assuming your new command is named `foo
4. Update `./etc/git-extras-completion.zsh`. Just follow existing code. 4. Update `./etc/git-extras-completion.zsh`. Just follow existing code.
5. (Optional) Update `./etc/bash_completion.sh`. 5. (Optional) Update `./etc/bash_completion.sh`.
6. (Optional) Update `./etc/git-extras.fish`. 6. (Optional) Update `./etc/git-extras.fish`.
7. (Optional) Add a test under `./tests`. 7. Run `./check_integrity.sh foo` to check if all done.
8. Run `./check_integrity.sh foo` to check if all done. (You may also run `./check_integrity.sh` to check all commands.)
You are welcome to open up an issue to discuss new commands or features before opening a pull request. You are welcome to open up an issue to discuss new commands or features before opening a pull request.
## Submitting a pull request
Please follow the suggestion in `./.github/PULL_REQUEST_TEMPLATE.md`.

View file

@ -12,13 +12,11 @@
- [`git clear-soft`](#git-clear-soft) - [`git clear-soft`](#git-clear-soft)
- [`git coauthor`](#git-coauthor) - [`git coauthor`](#git-coauthor)
- [`git commits-since`](#git-commits-since) - [`git commits-since`](#git-commits-since)
- [`git continue`](#git-continue)
- [`git contrib`](#git-contrib) - [`git contrib`](#git-contrib)
- [`git count`](#git-count) - [`git count`](#git-count)
- [`git cp`](#git-cp) - [`git cp`](#git-cp)
- [`git create-branch`](#git-create-branch) - [`git create-branch`](#git-create-branch)
- [`git delete-branch`](#git-delete-branch) - [`git delete-branch`](#git-delete-branch)
- [`git delete-gone-branches`](#git-delete-gone-branches)
- [`git delete-merged-branches`](#git-delete-merged-branches) - [`git delete-merged-branches`](#git-delete-merged-branches)
- [`git delete-squashed-branches`](#git-delete-squashed-branches) - [`git delete-squashed-branches`](#git-delete-squashed-branches)
- [`git delete-submodule`](#git-delete-submodule) - [`git delete-submodule`](#git-delete-submodule)
@ -30,7 +28,6 @@
- [`git force-clone`](#git-force-clone) - [`git force-clone`](#git-force-clone)
- [`git fork`](#git-fork) - [`git fork`](#git-fork)
- [`git fresh-branch`](#git-fresh-branch) - [`git fresh-branch`](#git-fresh-branch)
- [`git get`](#git-get)
- [`git gh-pages`](#git-gh-pages) - [`git gh-pages`](#git-gh-pages)
- [`git graft`](#git-graft) - [`git graft`](#git-graft)
- [`git guilt`](#git-guilt) - [`git guilt`](#git-guilt)
@ -54,7 +51,6 @@
- [`git rebase-patch`](#git-rebase-patch) - [`git rebase-patch`](#git-rebase-patch)
- [`git release`](#git-release) - [`git release`](#git-release)
- [`git rename-branch`](#git-rename-branch) - [`git rename-branch`](#git-rename-branch)
- [`git rename-file`](#git-rename-file)
- [`git rename-tag`](#git-rename-tag) - [`git rename-tag`](#git-rename-tag)
- [`git rename-remote`](#git-rename-remote) - [`git rename-remote`](#git-rename-remote)
- [`git repl`](#git-repl) - [`git repl`](#git-repl)
@ -76,8 +72,6 @@
- [`git undo`](#git-undo) - [`git undo`](#git-undo)
- [`git unlock`](#git-unlock) - [`git unlock`](#git-unlock)
- [`git utimes`](#git-utimes) - [`git utimes`](#git-utimes)
- [`git unwip`](#git-unwip)
- [`git wip`](#git-wip)
## git extras ## git extras
@ -182,8 +176,8 @@ authors :
1 Guillermo Rauch 0.6% 1 Guillermo Rauch 0.6%
``` ```
This command can also take a *committish*, and will print a summary for commits in This command can also take a *commitish*, and will print a summary for commits in
the committish range: the commitish range:
```bash ```bash
$ git summary v42.. $ git summary v42..
@ -229,7 +223,7 @@ project : git-extras
The `--line` option can also take a path, which will print a filtered summary for that folder or file. The `--line` option can also take a path, which will print a filtered summary for that folder or file.
The option `--output-style` tries to put as much summary information of the repo into defined styled way as possible. The option `--output-style` tries to put as much summary information of the repo into defined styled way as possible.
This is how the `tabular` output style and `oneline` output style look like This is how the `tebular` output style and `oneline` output style look like
```bash ```bash
$ git summary --output-style tabular $ git summary --output-style tabular
@ -283,20 +277,11 @@ usage: git bulk [-g] ([-a]|[-w <ws-name>]) <git command>
git bulk --listall git bulk --listall
``` ```
Register a workspace so that `git bulk` knows about it (it will be registered in your `.gitconfig`): Register a workspace so that `git bulk` knows about it (notice that <ws-root-directory> must be absolute path):
```bash ```bash
$ git bulk --addworkspace personal ~/workspaces/personal $ git bulk --addworkspace personal ~/workspaces/personal
``` ```
Notice that `<ws-root-directory>` must be an absolute path (or an environment variable pointing to an absolute path).
In the case of a **single quoted environment variable**, it will be dereferenced at `git-bulk` runtime, suitable for dynamic workspaces (*e.g.*, defined in your `.bashrc`).
As an illustration:
```bash
$ git bulk --addworkspace personal '$PERSONAL_WORKSPACE'
```
With option `--from` the URL to a single repository or a file containing multiple URLs can be added and they will be cloned directly into the workspace. Suitable for the initial setup of a multi-repo project. With option `--from` the URL to a single repository or a file containing multiple URLs can be added and they will be cloned directly into the workspace. Suitable for the initial setup of a multi-repo project.
```bash ```bash
@ -373,13 +358,6 @@ $ git brv
2020-01-08 master origin/master 265b03e Merge pull request #816 from spacewander/git-sed-pathspec 2020-01-08 master origin/master 265b03e Merge pull request #816 from spacewander/git-sed-pathspec
``` ```
When your repo has many branches, it can be more convenient to see this list in reverse. This can be set as the default by setting the git-extras.brv.reverse git option to true.
```bash
$ git brv --reverse
2020-01-08 master origin/master 265b03e Merge pull request #816 from spacewander/git-sed-pathspec
2020-01-14 adds-git-brv fork/adds-git-brv 1ca0d76 Fixes #700: Adds git-brv
```
## git repl ## git repl
@ -388,53 +366,14 @@ Git read-eval-print-loop. Lets you run `git` commands without typing 'git'.
Commands can be prefixed with an exclamation mark (!) to be interpreted as Commands can be prefixed with an exclamation mark (!) to be interpreted as
a regular command. a regular command.
Type `exit`, `quit`, or `q` to end the repl session. Type `exit` or `quit` to end the repl session.
Any arguments to git repl will be taken as the first command to execute in
the repl.
### CONFIGURATION
Commands entered in a repl session will be saved to a history file and be available in
future sessions, similar to a shell or programming language repl. By default,
there is one global history file, ~/.git_repl_history. You can specify that your projects
each have their own independent history file. This file will be saved in .git_repl_history
at the top level of the repo, and will need to be added to the repo or global .gitignore.
```bash
# remove the --global flag to configure only an individual project to have its own history file
git config --global git-extras.repl.use-local-history "true"
```
You can specify a default command to run when hitting enter:
```bash
git config --global git-extras.repl.on-enter-command "git status -sb"
```
You can configure which character is used at the end of the prompt: (default `>`):
```bash
git config --global git-extras.repl.prompt-character "±"
```
You can specify the prefix for the prompt, or remove it (default `git`):
```bash
git config --global git-extras.repl.prefix ""
```
You can have the name of the current git repo shown in the prompt (default `false`):
```bash
git config --global git-extras.repl.show-project-name "true"
```
```bash ```bash
$ git repl $ git repl
git version 2.34.1 git version 2.9.2
git-extras version 7.3.0 git-extras version 3.0.0
Type 'ls' to ls files below current directory; '!command' to execute any command or just 'subcommand' to execute any git subcommand; 'quit', 'exit', 'q', ^D, or ^C to exit the git repl. type 'ls' to ls files below current directory,
'!command' to execute any command or just 'subcommand' to execute any git subcommand
git (master)> ls-files git (master)> ls-files
History.md History.md
@ -612,20 +551,6 @@ $ git rename-branch old-name new-name
$ git rename-branch new-name $ git rename-branch new-name
``` ```
## git rename-file
Rename a file or directory and ensure Git recognizes the change, regardless of filesystem case-sensitivity.
It combines the functionality of the `mv` command and `git mv`. This is particularly useful for renaming files or directories
to change only their case, which might not be detected by Git on case-insensitive filesystems.
```bash
# Rename a file
git rename-file old_filename new_filename
# Rename a directory
git rename-file old_directory new_directory
```
## git rename-tag ## git rename-tag
Rename a tag (locally and remotely). Rename a tag (locally and remotely).
@ -933,21 +858,6 @@ Delete local and remote tag `name`:
$ git delete-tag 0.0.1 $ git delete-tag 0.0.1
``` ```
## git delete-gone-branches
Deletes all local branches whose remote-tracking branch has been deleted (i.e. branches shown as `[gone]` in `git branch -vv`). Use `--dry-run` to preview what would be deleted.
```bash
$ git delete-gone-branches
Deleted branch feature-123 (was abc1234).
Deleted branch feature-456 (was def5678).
$ git delete-gone-branches --dry-run
Would delete the following branches:
feature-123
feature-456
```
## git delete-merged-branches ## git delete-merged-branches
Deletes branches that are listed in `git branch --merged`. Deletes branches that are listed in `git branch --merged`.
@ -973,21 +883,12 @@ $ (main) git ...
## git fresh-branch ## git fresh-branch
Create empty local branch `docs`: Create empty local branch `name`:
```bash ```bash
$ git fresh-branch docs $ git fresh-branch docs
``` ```
## git get
Clone repository into a subdirectory of the configured path, `"$HOME/some-dir"`:
```bash
$ git config --global --add git-extras.get.clone-path "$HOME/some-dir"
$ git get 'https://github.com/hyperupcall/bake'
```
## git guilt ## git guilt
Calculate the change in blame between two revisions Calculate the change in blame between two revisions
@ -1042,6 +943,8 @@ $ git squash HEAD~3 "Work on a feature"
Populates the file matching `authors|contributors -i` with the authors of commits, according to the number of commits per author. Populates the file matching `authors|contributors -i` with the authors of commits, according to the number of commits per author.
Opens the file in `$EDITOR` when set.
See the ["MAPPING AUTHORS" section](https://git-scm.com/docs/git-shortlog#_mapping_authors) of **git-shortlog**(1) to coalesce together commits by the same person. See the ["MAPPING AUTHORS" section](https://git-scm.com/docs/git-shortlog#_mapping_authors) of **git-shortlog**(1) to coalesce together commits by the same person.
Updating AUTHORS file: Updating AUTHORS file:
@ -1203,14 +1106,6 @@ Internally this script uses `rsync` and not `scp` as the name suggests.
`git-rscp` - The reverse of `git-scp`. Copies specific files from the working directory of a remote repository to the current working directory. `git-rscp` - The reverse of `git-scp`. Copies specific files from the working directory of a remote repository to the current working directory.
The following options are available (must precede `<remote>`):
```bash
-v, --verbose Print what will be synced before syncing
-i, --interactive Prompt for confirmation before syncing (implies --verbose)
-n, --dry-run Show what would be synced, change nothing (implies --verbose)
```
### Examples ### Examples
Copy unstaged files to remote. Useful when you want to make quick test without making any commits Copy unstaged files to remote. Useful when you want to make quick test without making any commits
@ -1371,7 +1266,7 @@ Creates a zip archive of the current git repository. The name of the archive wil
## git missing ## git missing
Print out which commits are on one branch or the other but not both. Optionally, you can specify a path to limit the comparison to a specific directory or file. Print out which commits are on one branch or the other but not both.
```bash ```bash
$ git missing master $ git missing master
@ -1379,12 +1274,6 @@ $ git missing master
> 97ef387 only on master > 97ef387 only on master
``` ```
```bash
$ git missing master -- src/
< ed52989 only on current branch, in src/ directory
> 7988c4b only on master, in src/ directory
```
## git lock ## git lock
Lock a local file `filename`: Lock a local file `filename`:
@ -1428,8 +1317,8 @@ $ git reset-file .htaccess dc82b19
## git mr ## git mr
Checks out a merge request from GitLab, or a pull request from Forgejo/Codeberg. Checks out a merge request from GitLab. Usage: `git mr <ID|URL> [REMOTE]`.
Usage: `git mr <ID|URL> [REMOTE]`. Default remote is `origin`. Default remote is `origin`.
``` bash ``` bash
$ git mr 51 $ git mr 51
@ -1447,15 +1336,6 @@ From gitlab.com:owner/repository
Switched to branch 'mr/51' Switched to branch 'mr/51'
``` ```
A Forgejo/Codeberg pull request URL is also supported:
``` bash
$ git mr https://codeberg.org/owner/repository/pulls/51
From codeberg.org:owner/repository
* [new ref] refs/pull/51/head -> mr/51
Switched to branch 'mr/51'
```
Just like [git pr](#git-pr), `git mr` accepts a `clean` argument to trash all Just like [git pr](#git-pr), `git mr` accepts a `clean` argument to trash all
`mr/` branches. Ensure current branch is not one. `mr/` branches. Ensure current branch is not one.
@ -1705,25 +1585,3 @@ Abort current revert, rebase, merge or cherry-pick, without the need to find exa
## git magic ## git magic
Commits changes with a generated message. Commits changes with a generated message.
## git continue
Continue current revert, rebase, merge or cherry-pick, without the need to find exact command in history.
## git wip
Create a Work In Progress(WIP) commit, which will include all changes in the
working directory. (i.e., changes to existing files, new files, removed files)
```bash
$ git wip
```
## git unwip
Undo a Work In Progress(WIP) commit and put all of those changes back into the
working directory.
```bash
$ git unwip
```

View file

@ -1,142 +1,4 @@
7.5.0 / 2026-05-09
==================
* Use standard prefix for home dir installs (#1248)
* refactor(abort): common `gitdir` (#1244)
* Fix man page usage docs (#1241)
* Fix `git-changelog` to handle whitespace in command arguments (#1232)
* chore(deps): bump bats-core/bats-action from 3.0.1 to 4.0.0 (#1230)
* add details when multiple active operations found (#1229)
* Add persistent history to `git-repl` (#1226)
* Support passing ref to `git-commits-since` (#1228)
* ability to specify command when hitting enter (#1223)
* Improve `git-repl` prompt (#1224)
* feat: `delete-branch` multiple unique branch names completions (#1221)
* chore(deps): bump actions/checkout from 5 to 6 (#1219)
* Made Git Magic use `--force-with-lease` (#1218)
* chore(deps): bump actions/stale from 9 to 10 (#1214)
* chore(deps): bump actions/setup-go from 5 to 6 (#1215)
* chore(deps): bump actions/setup-python from 5 to 6 (#1216)
* Fix minor typo in `git rename-branch` man page (#1211)
* Improvements to Bash completion (#1210)
* Fix use of `git-whatchanged` to `git-log` (#1212)
* chore(deps): bump actions/checkout from 4 to 5 (#1209)
* Bump version to 7.5.0-dev (#1207)
7.4.0 / 2025-06-19
==================
* Format comparisons, functions, and redirections to be consistent (#1201)
* add git-wip and git-unwip (#669)
* chore(deps): bump bats-core/bats-action from 3.0.0 to 3.0.1
* Mostly finish pytest to Bats conversion (#1200)
* Implement half of tests in Bats (#1187)
* Add stale bot for old PRs (#1186)
* feat(git-bulk): add new option to not follow hidden directories (#1195)
* Feat: allow git-summary showing full path of repository (#1193)
* feat(git-bulk): add new option to no follow symlinks (#1194)
* docs(git-bulk): Add zsh completion (#1190)
* fix(git-bulk): fix workspace selection when cd fails (#1197)
* fix(git-bulk): quiet find errors by default (#1196)
* fix(git-bulk): fix a bad integer expression (#1198)
* chore(deps): bump astral-sh/ruff-action from 2 to 3 (#1189)
* Fix all ShellCheck errors and add to CI (#1179)
* chore(deps): bump astral-sh/ruff-action from 1 to 2 (#1188)
* fix(ci): use poetry (#1183)
* Delete etc/test.fish (#1185)
* feat: add git-continue (#1176)
* feat: add ruff linter with ci check (#1182)
* fix(ci): missing dollar sign (#1184)
* fix(github-actions): changed files output for editorcondig-checker (#1180)
* Revert "feat: add ruff linter with ci check (#1178)" (#1181)
* feat: add ruff linter with ci check (#1178)
* Support `GITHUB_TOKEN` var for `git-fork` and `git-pull-request` (#1177)
* Bump version to 7.4.0-dev (#1175)
7.3.0 / 2024-10-20
==================
* Fix stripping trailing forward slash for git-get (#1172)
* Change git-cp to use cleaner branch approach (#1169)
* Improve warning for `git clear` (#1168)
* Enhance `git-repl` (#1160)
* Update some documentation that was out of sync (#1164)
* Use filetimes in check_integrity (#1162)
* Update git-alias.md: add brs to prevent incorrect line behavior (#1161)
* Update git-bulk.md: use correct stylization in synopsis (#1163)
* Update git-repl.md: typo: "let's" for "lets" (#1158)
* Update instructions for the OpenSUSE installation (#1157)
* Add pathspec support in `git-missing` (#1156)
* feat: add rename-file command (#1149)
* Update Commands.md (#1148)
* fix: git-summary commit count (#1147)
* tests: update dependencies (#1142)
* chore(deps): bump masesgroup/retrieve-changed-files from 2 to 3 (#1144)
* chore(deps): bump actions/setup-go from 4 to 5 (#1143)
* ci: add dependabot update for GitHub actions (#1141)
* ci: update actions (#1140)
* Bump version to 7.3.0-dev (#1139)
7.2.0 / 2024-04-21
==================
* refactor: test utils and simplify the case code (#1136)
* Add --proceed flag to git-delete-squashed-branches (#1134) (#1135)
* test(browse-ci): add unit tests (#1130)
* test(git-browse): add unit tests (#1127)
* feat: add reverse option to git-brv (#1123)
* fix(utimes): change /dev/stdin to -
* fix(utimes): Support filenames with backspaces, etc. (#1122)
* chore: add poetry to handle the tests of the git extras (#1121)
* Fix typo in ci.yml (#1120)
* Fix: harden utimes, use single quotes (#1109)
* Fix: patch git-utimes (fixes #1118) (#1119)
* add pull request manner (#1113)
* maintenance: Add my name as maintainer in AUTHORS (#1117)
* test(git-authors): add unit test (#1098)
* Add more comprensive dependencies (#1111)
* fix: git-standup find error (tj#1106) (#1110)
* Improve defaults for testing suite (#1104)
* feat: Speed up utimes (#1108)
* Overhaul CONTRIBUTING document (#1103)
* Bump version to 7.2.0-dev (#1099)
7.1.0 / 2023-10-28
==================
* git-cp: don't stop execution when merge.ff is not set (#1096)
* Allow `git cp` to create destination folder automatically (#1091)
* fix: Use `-iname` and expressions instead of `-iregex` (#1094)
* change installation source from master to main (#1092)
* test(git-archive-file): add unit test (#1084)
* ci: Use Go v1.20 for running `editorconfig-checker` (#1086)
* test(git-alias): add its unit test (#1077)
* makefile: Allow bypassing conflict check (#1080)
* fix: Restore zsh completions to working completion (#1079)
* fix: add missing quote in git-extras-completion.zsh (#1078)
* feat: Implement completion for `git coauthor` (#1074)
* fix: Move improvements via ShellCheck (#1075)
* feat(auto-test): CI with pytest (#1066)
* git-feature: add configurable branch separator (#1072)
* git-psykorebase: determine branch names with bash pattern substitution (#1073)
* git-cp: continue to merge when merge.ff is only (#1070)
* git archive-file: change base ARCHIVE_NAME (#1071)
* readme: Add secondary location of screencast (#1065)
* fix: Improve Bash hygiene (#1056)
* feat: Implement `git-get` command (#1045)
* Corrected grammar in bin/git-cp (#1061)
* Improve `git-ignore` command (#1047)
* I have made two improvements to the git-bulk: (#1054)
* Type properly `__gitex_command_successful` calls and capitalizate github to GitHub (#1049)
* Add typo checker
* Fix comment typo in git-authors (#1050)
* tweak: Fix typos (#1046)
* Makefile: init SYSCONFDIR before using it (#1044)
* Makefile: tune MANPREFIX configuration for FreeBSD (#1043)
* Makefile: set bash COMPL_DIR to FreeBSD expected defaults (#1042)
* Bump version to 7.1.0-dev (#1041)
7.0.0 / 2023-04-20 7.0.0 / 2023-04-20
================== ==================

View file

@ -1,20 +1,14 @@
# Installation # Installing git-extras
## Dependencies ## Dependencies
Some commands require extra dependencies which are unavailable in some platforms. Some commands require extra dependencies which are unavailable in some platforms.
You may need to install them manually. They are: You may need to install them manually.
Those dependencies are listed below:
* column
* bash 4.0+ * bash 4.0+
* Git 2.17+
* `column`
* `awk`
* `find`
* `tput`
* cURL (only required for `git-fork`, `git-ignore-io`, `git-pull-request`)
* `ps` (only required for `git-changelog`)
* `rsync` (only required for `git-rscp`, `git-scp`)
* `xargs` (only required for `git-delete-merged-branches`, `git-force-clone`, `git-sed`, `git-scp`)
If `bash --version` shows a lower version, you need to update it. If `bash --version` shows a lower version, you need to update it.
For example, the default bash in Mac is usually too old and you may need to update it via `brew install bash`. For example, the default bash in Mac is usually too old and you may need to update it via `brew install bash`.
@ -41,10 +35,9 @@ $ sudo dnf install git-extras
### openSUSE ### openSUSE
Substitute your openSUSE version in the command below (in this case we are considering openSUSE Leap 15.6): Substitute your openSUSE version in the command below (in this case we are considering openSUSE Leap 15.2):
```bash ```bash
$ sudo zypper ar https://download.opensuse.org/repositories/devel:/tools:/scm/15.6/devel:tools:scm.repo $ sudo zypper ar https://download.opensuse.org/repositories/devel:/tools:/scm/openSUSE_Leap_15.2/devel:tools:scm.repo
``` ```
and install it: and install it:
@ -75,6 +68,7 @@ $ nix-env -i git-extras
[Abdullah](https://github.com/AWAN) has written a [Pkgfile](https://abdullah.today/ports/git-extras/Pkgfile) for his beloved [distro](https://crux.nu). [Abdullah](https://github.com/AWAN) has written a [Pkgfile](https://abdullah.today/ports/git-extras/Pkgfile) for his beloved [distro](https://crux.nu).
### Homebrew ### Homebrew
```bash ```bash
@ -83,6 +77,7 @@ $ brew install git-extras
Installing from Homebrew will not give you the option omit certain `git-extras` if they conflict with existing git aliases. To have this option, build from source. Installing from Homebrew will not give you the option omit certain `git-extras` if they conflict with existing git aliases. To have this option, build from source.
### Arch Linux ### Arch Linux
* [git-extras](https://aur.archlinux.org/packages/git-extras/) * [git-extras](https://aur.archlinux.org/packages/git-extras/)
@ -92,7 +87,6 @@ Installing from Homebrew will not give you the option omit certain `git-extras`
First, please install `Git for Windows 2.x` from 'https://github.com/git-for-windows/git/releases'. First, please install `Git for Windows 2.x` from 'https://github.com/git-for-windows/git/releases'.
Second, clone the `git-extras` repo into any folder you like. Second, clone the `git-extras` repo into any folder you like.
```bash ```bash
git clone https://github.com/tj/git-extras.git git clone https://github.com/tj/git-extras.git
# checkout the latest tag (optional) # checkout the latest tag (optional)
@ -144,7 +138,7 @@ alternate location, specify a `PREFIX` when calling `make`.
```bash ```bash
# Non-root users can install under their home directory # Non-root users can install under their home directory
make install PREFIX=$HOME/.local make install PREFIX=$HOME/software
# For third-party software kept under /opt # For third-party software kept under /opt
make install PREFIX=/opt make install PREFIX=/opt
@ -154,7 +148,7 @@ If you want to relocate the bulk of the installation but still have configuratio
files installed to the system `/etc` dir or other alternate location, you can files installed to the system `/etc` dir or other alternate location, you can
specify `SYSCONFDIR` in addition to `PREFIX`. specify `SYSCONFDIR` in addition to `PREFIX`.
```sh ```
$ sudo make install PREFIX=/usr/local SYSCONFDIR=/etc $ sudo make install PREFIX=/usr/local SYSCONFDIR=/etc
``` ```
@ -165,13 +159,12 @@ See the Makefile for details on advanced configuration options.
One-liner: One-liner:
```bash ```bash
curl -sSL https://raw.githubusercontent.com/tj/git-extras/main/install.sh | sudo bash /dev/stdin curl -sSL https://raw.githubusercontent.com/tj/git-extras/master/install.sh | sudo bash /dev/stdin
``` ```
## Installing as Zsh plugin ## Installing as Zsh plugin
[ZInit](https://github.com/zdharma/zinit) can install git-extras by using: [ZInit](https://github.com/zdharma/zinit) can install git-extras by using:
```zsh ```zsh
zinit ice as"program" pick"$ZPFX/bin/git-*" src"etc/git-extras-completion.zsh" make"PREFIX=$ZPFX" zinit ice as"program" pick"$ZPFX/bin/git-*" src"etc/git-extras-completion.zsh" make"PREFIX=$ZPFX"
zinit light tj/git-extras zinit light tj/git-extras

View file

@ -1,25 +1,20 @@
PREFIX ?= /usr/local PREFIX ?= /usr/local
BINPREFIX ?= "$(PREFIX)/bin" BINPREFIX ?= "$(PREFIX)/bin"
SYSCONFDIR ?= $(PREFIX)/etc
SHELL := bash SHELL := bash
OS = $(shell uname) OS = $(shell uname)
ifeq ($(OS), FreeBSD) ifeq ($(OS), FreeBSD)
MANPREFIX ?= "$(PREFIX)/man/man1" MANPREFIX ?= "$(PREFIX)/man/man1"
ifeq ($(MANPREFIX), /usr/local)
MANPREFIX = "/usr/local/man/man1"
endif
else else
MANPREFIX ?= "$(PREFIX)/share/man/man1" MANPREFIX ?= "$(PREFIX)/share/man/man1"
endif endif
ifeq ($(OS), Darwin) ifeq ($(OS), Darwin)
COMPL_DIR ?= "$(DESTDIR)$(SYSCONFDIR)/bash_completion.d" COMPL_DIR ?= "$(DESTDIR)$(SYSCONFDIR)/bash_completion.d"
else ifeq ($(OS), FreeBSD)
COMPL_DIR ?= "$(DESTDIR)$(SYSCONFDIR)/bash_completion.d"
else else
COMPL_DIR ?= "$(DESTDIR)$(SYSCONFDIR)/bash-completion/completions" COMPL_DIR ?= "$(DESTDIR)$(SYSCONFDIR)/bash-completion/completions"
endif endif
SYSCONFDIR ?= $(PREFIX)/etc
BINS = $(wildcard bin/git-*) BINS = $(wildcard bin/git-*)
MANS = $(wildcard man/git-*.md) MANS = $(wildcard man/git-*.md)
MAN_BINS = $(filter-out man/git-extras.md, $(MANS)) MAN_BINS = $(filter-out man/git-extras.md, $(MANS))
@ -45,24 +40,22 @@ install: check
@if [ "$(INSTALL_VIA)" = brew ]; then \ @if [ "$(INSTALL_VIA)" = brew ]; then \
git apply brew-release.patch || { echo "Can't apply brew release patch"; exit 1; } \ git apply brew-release.patch || { echo "Can't apply brew release patch"; exit 1; } \
fi fi
mkdir -p $(DESTDIR)$(MANPREFIX) @mkdir -p $(DESTDIR)$(MANPREFIX)
mkdir -p $(DESTDIR)$(BINPREFIX) @mkdir -p $(DESTDIR)$(BINPREFIX)
@echo '... installing bins to '$(DESTDIR)$(BINPREFIX) @echo "... installing bins to $(DESTDIR)$(BINPREFIX)"
@echo '... installing man pages to '$(DESTDIR)$(MANPREFIX) @echo "... installing man pages to $(DESTDIR)$(MANPREFIX)"
$(eval TEMPFILE := $(shell mktemp -q $${TMPDIR:-/tmp}/git-extras.XXXXXX 2>/dev/null || mktemp -q)) $(eval TEMPFILE := $(shell mktemp -q $${TMPDIR:-/tmp}/git-extras.XXXXXX 2>/dev/null || mktemp -q))
@# chmod from rw-------(default) to rwxrwxr-x, so that users can exec the scripts @# chmod from rw-------(default) to rwxrwxr-x, so that users can exec the scripts
@chmod 775 $(TEMPFILE) @chmod 775 $(TEMPFILE)
$(eval EXISTED_ALIASES := $(shell \ $(eval EXISTED_ALIASES := $(shell \
git config --get-regexp 'alias\..*' | awk '{print "git-" substr($$1, 7)}')) git config --get-regexp 'alias.*' | awk '{print "git-" substr($$1, 7)}'))
@$(foreach COMMAND, $(COMMANDS), \ @$(foreach COMMAND, $(COMMANDS), \
should_install='yes'; \ disable=''; \
if [ ! -z "$(filter $(COMMAND), $(EXISTED_ALIASES))" ] && [ "$$SKIP_CONFLICT_CHECK" != yes ]; then \ if test ! -z "$(filter $(COMMAND), $(EXISTED_ALIASES))"; then \
read -p "$(COMMAND) conflicts with an alias, still install it? [y/n]: " answer; \ read -p "$(COMMAND) conflicts with an alias, still install it and disable the alias? [y/n]" answer; \
if [ "$$answer" = 'n' ] || [ "$$answer" = 'N' ]; then \ test "$$answer" = 'n' -o "$$answer" = 'N' && disable="true"; \
should_install="no"; \
fi; \
fi; \ fi; \
if [ "$$should_install" = 'yes' ]; then \ if test -z "$$disable"; then \
echo "... installing $(COMMAND)"; \ echo "... installing $(COMMAND)"; \
head -1 bin/$(COMMAND) > $(TEMPFILE); \ head -1 bin/$(COMMAND) > $(TEMPFILE); \
cat $(LIB) >> $(TEMPFILE); \ cat $(LIB) >> $(TEMPFILE); \
@ -140,7 +133,4 @@ docclean:
rm -f man/*.1 rm -f man/*.1
rm -f man/*.html rm -f man/*.html
test: .PHONY: default docs clean docclean check install uninstall
bats ./tests
.PHONY: default docs check install uninstall clean docclean test

View file

@ -6,15 +6,15 @@ Little git extras.
Just getting started? Check out these screencasts: Just getting started? Check out these screencasts:
* [introduction](https://vimeo.com/45506445) ([archive.org link](https://web.archive.org/web/20230219181235id_/vod-progressive.akamaized.net/exp=1676834145~acl=%2Fvimeo-prod-skyfire-std-us%2F01%2F4101%2F1%2F45506445%2F107111328.mp4~hmac=065b68f23c4b6a222463097b36d1c346995a9559baa9b819972da95550018471/vimeo-prod-skyfire-std-us/01/4101/1/45506445/107111328.mp4)) -- covers `git-ignore`, `git-setup`, `git-changelog`, `git-release`, `git-effort` and more * [introduction](https://vimeo.com/45506445) -- covering git-ignore, git-setup, git-changelog, git-release, git-effort and more
## Installation ## Installation
See the [Installation](Installation.md) page. See [Installation](Installation.md) page.
## Commands ## Commands
Go to the [Commands](Commands.md) page for basic usage and examples. Go to [Commands](Commands.md) page for basic usage and examples.
__GIT utilities__ -- repo summary, repl, changelog population, author commit percentages and more __GIT utilities__ -- repo summary, repl, changelog population, author commit percentages and more
@ -27,8 +27,8 @@ Please read [Contributing](CONTRIBUTING.md) before you make a PR, thanks!
## The change of the default branch ## The change of the default branch
As of Git Extras 6.4 the assumed default branch name changed from `master` to `main`. As of Git Extras 6.4 the assumed default branch name changed from `master` to `main`.
This affects the Git Extras commands `git archive-file`, `git delete-merged-branches`, `git delta`, `git pull-request`, `git show-merged-branches`, `git show-unmerged-branches`, and `git squash`. This affects the Git Extras commands `git archive-file`, `git delete-merged-branches`, `git delta`, `git pull-request`, `git show-merged-branches`, `git show-unmerged-branches` and `git squash`.
To change the default branch name to `master`: change either the configuration `git-extras.default-branch` or `init.defaultBranch` to `master`; the former takes precedence. To change the default branch name to `master`: change either the configuration `git-extras.default-branch` or `init.defaultBranch` to `master`, the former takes precedence.
For example, `git config git-extras.default-branch master`. For example, `git config git-extras.default-branch master`

View file

@ -1,45 +1,17 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -euo pipefail
# git rev-parse emits an error if not in a git repo so only need to bail out
gitdir="$(git rev-parse --git-dir)" || exit gitdir="$(git rev-parse --git-dir)" || exit
opfound=
fcnt=
for i in cherry-pick merge rebase revert; do
f=${i^^}
f=${f/-/_}
test -f "${gitdir}/${f}_HEAD" && fcnt=1$fcnt && opfound=$i
done
discover_op() { if [ "${fcnt}" != 1 ]; then
local op echo "I don't know what to abort" >&2
for op in cherry_pick merge rebase revert ; do exit 1
if [ -f "${gitdir}/${op^^}_HEAD" ]; then fi
echo "${op/_/-}"
fi
done
}
validate_op() { git "${opfound}" --abort
local op="$1"
if [ -z "$op" ]; then
echo "No active operation found" >&2
exit 1
fi
if [[ "$(echo "$op" | wc -l)" -gt 1 ]]; then
echo "Multiple active operations found:" >&2
for o in $op; do
echo " - $o: HEAD: $(cat "${gitdir}/${o}_HEAD")" >&2
done
exit 1
fi
}
discover_action() {
local action=${1/git-/}
if [ "$action" != "abort" ] && [ "$action" != "continue" ]; then
echo "Invalid action: $1" >&2
exit 1
fi
echo "$action"
}
action=$(discover_action "$(basename "$0")")
op=$(discover_op)
validate_op "$op"
git "$op" "--$action"

View file

@ -1,45 +1,16 @@
#!/usr/bin/env bash #!/usr/bin/env bash
options=""
usage() { usage() {
cat <<HERE cat <<HERE
usage: git alias [options] # list all aliases usage: git alias # list all aliases
or: git alias [options] <search-pattern> # show aliases matching pattern or: git alias <search-pattern> # show aliases matching pattern
or: git alias [options] <alias-name> <command> # alias a command or: git alias <alias-name> <command> # alias a command
options:
--global Show or create alias in the system config
--local Show or create alias in the repository config
HERE HERE
} }
if [[ "$1" == "--local" || "$1" == "--global" ]]; then
options=$1
shift
fi
case $# in case $# in
0) 0) git config --get-regexp 'alias.*' | sed 's/^alias\.//' | sed 's/[ ]/ = /' | sort ;;
if [[ -z "$options" ]]; then 1) git alias | grep -e "$1" ;;
git config --get-regexp 'alias.*' | sed 's/^alias\.//' | sed 's/[ ]/ = /' | sort 2) git config --global alias."$1" "$2" ;;
else
git config "$options" --get-regexp 'alias.*' | sed 's/^alias\.//' | sed 's/[ ]/ = /' | sort
fi
;;
1)
if [[ -z "$options" ]]; then
git config --get-regexp 'alias.*' | sed 's/^alias\.//' | sed 's/[ ]/ = /' | sort | grep -e "$1"
else
git config "$options" --get-regexp 'alias.*' | sed 's/^alias\.//' | sed 's/[ ]/ = /' | sort | grep -e "$1"
fi
;;
2)
if [[ -z "$options" ]]; then
git config alias."$1" "$2"
else
git config "$options" alias."$1" "$2"
fi
;;
*) >&2 echo "error: too many arguments." && usage && exit 1 ;; *) >&2 echo "error: too many arguments." && usage && exit 1 ;;
esac esac

View file

@ -1,11 +1,11 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# extract current branch name # extract current branch name
BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null) BRANCH=$(git rev-parse --abbrev-ref HEAD 2> /dev/null)
# get name of the most top folder of current directory, used for the # get name of the most top folder of current directory, used for the
# output filename # output filename
ARCHIVE_NAME=$(basename "$(git rev-parse --show-toplevel)") ARCHIVE_NAME=$(basename "$PWD")
if [[ $BRANCH = tags* ]]; then if [[ $BRANCH = tags* ]]; then
BRANCH=$(git describe) BRANCH=$(git describe)

View file

@ -3,6 +3,7 @@
LIST=false LIST=false
NO_EMAIL=false NO_EMAIL=false
FILE="" FILE=""
EDITOR=$(git var GIT_EDITOR)
while [[ $# -gt 0 ]]; do while [[ $# -gt 0 ]]; do
case $1 in case $1 in
@ -21,9 +22,9 @@ done
if ! $LIST; then if ! $LIST; then
FILE=$1 FILE=$1
if [ -z "$FILE" ]; then if test "$FILE" = ""; then
FILE=$(find . -mindepth 1 -maxdepth 1 \( -iname '*authors*' -o -iname '*contributors*' \) | head -n1) FILE=$(ls | grep -E 'authors|contributors' -i|head -n1)
if [ -z "$FILE" ]; then if test "$FILE" = ""; then
FILE='AUTHORS' FILE='AUTHORS'
fi fi
fi fi
@ -35,11 +36,11 @@ fi
authors() { authors() {
if $NO_EMAIL; then if $NO_EMAIL; then
# email will be used to uniq authors. # eamil will be used to uniq authors.
git shortlog HEAD -sne | awk '{$1=""; sub(" ", ""); print}' | awk -F'<' '!x[$1]++' | awk -F'<' '!x[$2]++' \ git shortlog -sne | awk '{$1=""; sub(" ", ""); print}' | awk -F'<' '!x[$1]++' | awk -F'<' '!x[$2]++' \
| awk -F'<' '{gsub(/ +$/, "", $1); print $1}' | awk -F'<' '{gsub(/ +$/, "", $1); print $1}'
else else
git shortlog HEAD -sne | awk '{$1=""; sub(" ", ""); print}' | awk -F'<' '!x[$1]++' | awk -F'<' '!x[$2]++' git shortlog -sne | awk '{$1=""; sub(" ", ""); print}' | awk -F'<' '!x[$1]++' | awk -F'<' '!x[$2]++'
fi fi
} }
@ -51,4 +52,5 @@ if $LIST; then
authors authors
else else
authors >> "$FILE" authors >> "$FILE"
test -n "$EDITOR" && $EDITOR "$FILE"
fi fi

View file

@ -7,20 +7,6 @@ if ! (( BASH_VERSINFO[0] > 4 ||
exit 1 exit 1
fi fi
# allow the user to set a default reverse option in an environment variable
reverse=$(git config --get git-extras.brv.reverse || echo false)
while [[ $# -gt 0 ]]; do
case $1 in
-r | --reverse)
reverse=true
shift
;;
*)
break
;;
esac
done
if [[ -t 1 ]]; then if [[ -t 1 ]]; then
shopt -s checkwinsize shopt -s checkwinsize
COLUMNS=$(tput cols) COLUMNS=$(tput cols)
@ -50,14 +36,9 @@ for b in "${!upstream[@]}"; do
done done
mapfile -t ordered < <( mapfile -t ordered < <(
# the reverse option of git-brv causes the sort to be sorted normally rather than in reverse
reverse_opt=""
if [[ $reverse = false ]]; then
reverse_opt="-r"
fi
for b in "${!date[@]}"; do for b in "${!date[@]}"; do
printf '%d\t%s\n' "${date[$b]}" "$b" printf '%d\t%s\n' "${date[$b]}" "$b"
done | sort -n $reverse_opt | cut -f2- done | sort -rn | cut -f2-
) )
current=$(git symbolic-ref -q --short HEAD) current=$(git symbolic-ref -q --short HEAD)

View file

@ -9,14 +9,12 @@ guardedmode=false
singlemode=false singlemode=false
allwsmode=false allwsmode=false
quiet=false quiet=false
no_follow_symlinks=false
no_follow_hidden=false
# #
# print usage message # print usage message
# #
usage() { usage() {
echo 1>&2 "usage: git bulk [--no-follow-symlinks] [--no-follow-hidden] [-q|--quiet] [-g] ([-a]|[-w <ws-name>]) <git command>" echo 1>&2 "usage: git bulk [-q|--quiet] [-g] ([-a]|[-w <ws-name>]) <git command>"
echo 1>&2 " git bulk --addworkspace <ws-name> <ws-root-directory> (--from <URL or file>)" echo 1>&2 " git bulk --addworkspace <ws-name> <ws-root-directory> (--from <URL or file>)"
echo 1>&2 " git bulk --removeworkspace <ws-name>" echo 1>&2 " git bulk --removeworkspace <ws-name>"
echo 1>&2 " git bulk --addcurrent <ws-name>" echo 1>&2 " git bulk --addcurrent <ws-name>"
@ -24,33 +22,22 @@ usage() {
echo 1>&2 " git bulk --listall" echo 1>&2 " git bulk --listall"
} }
cdfail() {
echo 1>&2 "failed to change directory: $1"
exit 1
}
# add another workspace to global git config # add another workspace to global git config
addworkspace() { function addworkspace {
git config --global bulkworkspaces."$wsname" "$wsdir"; git config --global bulkworkspaces."$wsname" "$wsdir";
if [ -n "$source" ]; then if [ -n "$source" ]; then
if [ ! -d "$wsdir" ]; then echo 1>&2 "Path of workspace doesn't exist, make it first."; exit 1; fi if [ ! -d "$wsdir" ]; then echo 1>&2 "Path of workspace doesn't exist, make it first."; exit 1; fi
regex='http(s)?://|ssh://|(git@)?.*:.*/.*' regex='http(s)?://|ssh://|(git@)?.*:.*/.*'
if [[ "$source" =~ $regex ]]; then if [[ "$source" =~ $regex ]]; then
pushd "$wsdir" > /dev/null || cdfail "$wsdir" pushd "$wsdir" > /dev/null
git clone "$source" git clone "$source"
popd > /dev/null || cdfail "$OLDPWD" popd > /dev/null
else else
source=$(realpath "$source" 2>/dev/null) source=$(realpath "$source" 2>/dev/null)
if [ -f "$source" ]; then if [ -f "$source" ]; then
pushd "$wsdir" > /dev/null || cdfail "$wsdir" pushd "$wsdir" > /dev/null
while IFS= read -r line; do while read -r line; do git clone "$line"; done < "$source";
if [ -n "$line" ]; then popd > /dev/null
# the git clone command to take the complete line in the repository.txt as separate argument. This facilitated the cloning of the repository with a custom folder name.
# shellcheck disable=SC2086
git clone $line;
fi
done < "$source"
popd > /dev/null || cdfail "$OLDPWD"
else else
echo 1>&2 "format of URL or file unknown" echo 1>&2 "format of URL or file unknown"
fi fi
@ -59,19 +46,19 @@ addworkspace() {
} }
# add current directory # add current directory
addcurrent() { git config --global bulkworkspaces."$wsname" "$PWD"; } function addcurrent { git config --global bulkworkspaces."$wsname" "$PWD"; }
# remove workspace from global git config # remove workspace from global git config
removeworkspace() { checkWSName && git config --global --unset bulkworkspaces."$wsname"; } function removeworkspace { checkWSName && git config --global --unset bulkworkspaces."$wsname"; }
# remove workspace from global git config # remove workspace from global git config
purge() { git config --global --remove-section bulkworkspaces; } function purge { git config --global --remove-section bulkworkspaces; }
# list all current workspace locations defined # list all current workspace locations defined
listall() { git config --global --get-regexp bulkworkspaces; } function listall { git config --global --get-regexp bulkworkspaces; }
# guarded execution of a git command in one specific repository # guarded execution of a git command in one specific repository
guardedExecution () { function guardedExecution () {
if [ "${quiet?}" != "true" ] || $guardedmode; then if [ "${quiet?}" != "true" ] || $guardedmode; then
echo 1>&2 "${bldred}->${reset} executing ${inverse}git $gitcommand${reset} in repository ${leadingpath%/*}/${bldred}${curdir##*/}${reset}" echo 1>&2 "${bldred}->${reset} executing ${inverse}git $gitcommand${reset} in repository ${leadingpath%/*}/${bldred}${curdir##*/}${reset}"
fi fi
@ -88,7 +75,7 @@ guardedExecution () {
} }
# check if the passed command is known as a core git command # check if the passed command is known as a core git command
checkGitCommand () { function checkGitCommand () {
if git help -a | grep -o -q "\b${corecommand}\b"; then if git help -a | grep -o -q "\b${corecommand}\b"; then
echo 1>&2 "Core command \"$corecommand\" accepted." echo 1>&2 "Core command \"$corecommand\" accepted."
else else
@ -101,7 +88,7 @@ checkGitCommand () {
} }
# check if workspace name is registered # check if workspace name is registered
checkWSName () { function checkWSName () {
while read -r workspace; do while read -r workspace; do
parseWsName "$workspace" parseWsName "$workspace"
if [[ $rwsname == "$wsname" ]]; then return; fi if [[ $rwsname == "$wsname" ]]; then return; fi
@ -111,24 +98,14 @@ checkWSName () {
} }
# parse out wsname from workspacespec # parse out wsname from workspacespec
parseWsName () { function parseWsName () {
local wsspec="$1" local wsspec="$1"
# Get the workspace value from its specification in the `.gitconfig`.
# May be an absolute path or a variable name of the form: `$VARNAME`
rwsdir=${wsspec#* } rwsdir=${wsspec#* }
if [[ ${rwsdir:0:1} == '$' ]]; then
# Dereference the `rwsdir` value which is a variable name.
rwsdir_varname=${rwsdir:1}
rwsdir=${!rwsdir_varname}
if [[ -z "${rwsdir}" ]]; then
echo 1>&2 "error: bad environment variable: $rwsdir_varname" && exit 1
fi
fi
rwsname=${wsspec#*.} && rwsname=${rwsname%% *} rwsname=${wsspec#*.} && rwsname=${rwsname%% *}
} }
# detects the wsname of the current directory # detects the wsname of the current directory
wsnameToCurrent () { function wsnameToCurrent () {
while read -r workspace; do while read -r workspace; do
if [ -z "$workspace" ]; then continue; fi if [ -z "$workspace" ]; then continue; fi
parseWsName "$workspace" parseWsName "$workspace"
@ -140,44 +117,33 @@ wsnameToCurrent () {
} }
# helper to check number of arguments. # helper to check number of arguments.
allowedargcount () { function allowedargcount () {
if [ "$paramcount" -ne "${1:-0}" ] && [ "$paramcount" -ne "${2:-0}" ]; then if [ "$paramcount" -ne "$1" ] && [ "$paramcount" -ne "$2" ]; then
echo 1>&2 "error: wrong number of arguments" && usage; echo 1>&2 "error: wrong number of arguments" && usage;
exit 1; exit 1;
fi fi
} }
# execute the bulk operation # execute the bulk operation
executBulkOp () { function executBulkOp () {
checkGitCommand checkGitCommand
if ! $allwsmode && ! $singlemode; then wsnameToCurrent; fi # by default git bulk works within the 'current' workspace if ! $allwsmode && ! $singlemode; then wsnameToCurrent; fi # by default git bulk works within the 'current' workspace
listall | while read -r workspacespec; do listall | while read -r workspacespec; do
parseWsName "$workspacespec" parseWsName "$workspacespec"
if [[ -n $wsname ]] && [[ $rwsname != "$wsname" ]]; then continue; fi if [[ -n $wsname ]] && [[ $rwsname != "$wsname" ]]; then continue; fi
cd "$rwsdir" || exit 1 eval cd "\"$rwsdir\""
local actual=$PWD local actual=$PWD
[ "${quiet?}" != "true" ] && echo 1>&2 "Executing bulk operation in workspace ${inverse}$actual${reset}" [ "${quiet?}" != "true" ] && echo 1>&2 "Executing bulk operation in workspace ${inverse}$actual${reset}"
# build `find` flags depending on command-line options allGitFolders=( $(eval find -L . -name ".git") )
local find_flags=()
if [[ "$no_follow_symlinks" == true ]]; then
find_flags+=(-P)
else
find_flags+=(-L)
fi
# find all git repositories under the workspace on which we want to operate
readarray allGitFolders < <(find "${find_flags[@]}" . -name ".git" 2>/dev/null)
for line in "${allGitFolders[@]}"; do for line in "${allGitFolders[@]}"; do
local gitrepodir=${line::${#line}-5} # cut the .git part of find results to have the root git directory of that repository local gitrepodir=${line::${#line}-5} # cut the .git part of find results to have the root git directory of that repository
cd "$gitrepodir" || exit 1 # into git repo location eval cd "\"$gitrepodir\"" # into git repo location
local curdir=$PWD local curdir=$PWD
local leadingpath=${curdir#"${actual}"} local leadingpath=${curdir#"${actual}"}
# do not execute if we do not want to consider a ".git" directory under a hidden directory guardedExecution "$@"
if [ $no_follow_hidden = false ] || ! [[ "$leadingpath" =~ "/." ]]; then eval cd "\"$rwsdir\"" # back to origin location of last find command
guardedExecution "$@"
fi
cd "$rwsdir" || exit 1 # back to origin location of last find command
done done
done done
} }
@ -194,11 +160,7 @@ while [ "${#}" -ge 1 ] ; do
--listall|--purge) --listall|--purge)
butilcommand="${1:2}" && break ;; butilcommand="${1:2}" && break ;;
--removeworkspace|--addcurrent|--addworkspace) --removeworkspace|--addcurrent|--addworkspace)
butilcommand="${1:2}" && wsname="$2" && wsdir="$3" && if [ "$4" = "--from" ]; then source="$5"; fi && break ;; butilcommand="${1:2}" && wsname="$2" && wsdir="$3" && if [ "$4" == "--from" ]; then source="$5"; fi && break ;;
--no-follow-symlinks)
no_follow_symlinks=true ;;
--no-follow-hidden)
no_follow_hidden=true ;;
-a) -a)
allwsmode=true ;; allwsmode=true ;;
-g) -g)

View file

@ -9,15 +9,6 @@ GIT_MERGELOG_FORMAT="$(git config changelog.mergeformat)"
GIT_EDITOR="$(git var GIT_EDITOR)" GIT_EDITOR="$(git var GIT_EDITOR)"
PROGNAME="git-changelog" PROGNAME="git-changelog"
git_editor() {
if test -z "${GIT_EDITOR:+set}"
then
GIT_EDITOR="$(git var GIT_EDITOR)" || return $?
fi
eval "$GIT_EDITOR" '"$@"'
}
_usage() { _usage() {
cat << EOF cat << EOF
usage: $PROGNAME options [file] usage: $PROGNAME options [file]
@ -155,8 +146,6 @@ _fetchCommitRange() {
local start_tag="$2" local start_tag="$2"
local final_tag="$3" local final_tag="$3"
# This shellcheck disable is applied to the whole if-body
# shellcheck disable=SC2086
if [[ "$list_all" == true ]]; then if [[ "$list_all" == true ]]; then
git log $GIT_LOG_OPTS --pretty=format:"${CUR_GIT_LOG_FORMAT}" git log $GIT_LOG_OPTS --pretty=format:"${CUR_GIT_LOG_FORMAT}"
elif [[ -n "$final_tag" && "$start_tag" == "null" ]]; then elif [[ -n "$final_tag" && "$start_tag" == "null" ]]; then
@ -291,8 +280,7 @@ commitList() {
for (( i=0; i<"${_tags_list_keys_length}"; i++ )); do for (( i=0; i<"${_tags_list_keys_length}"; i++ )); do
local __curr_tag="${tags_list_keys[$i]}" local __curr_tag="${tags_list_keys[$i]}"
local __prev_tag="${tags_list_keys[$i+1]:-null}" local __prev_tag="${tags_list_keys[$i+1]:-null}"
local __curr_date local __curr_date="$(_valueForKeyFakeAssocArray "${__curr_tag}" "${tags_list[*]}")"
__curr_date="$(_valueForKeyFakeAssocArray "${__curr_tag}" "${tags_list[*]}")"
__curr_date="${__curr_date##*=>}" __curr_date="${__curr_date##*=>}"
# output latest commits, up until the most-recent tag, these are all # output latest commits, up until the most-recent tag, these are all
@ -540,10 +528,9 @@ main() {
# #
# generate changelog # generate changelog
# #
local tmpfile changelog title_tag local tmpfile="$(git_extra_mktemp)"
tmpfile="$(git_extra_mktemp)" local changelog="$(_valueForKeyFakeAssocArray "output_file" "${option[*]}")"
changelog="$(_valueForKeyFakeAssocArray "output_file" "${option[*]}")" local title_tag="$(_valueForKeyFakeAssocArray "title_tag" "${option[*]}")"
title_tag="$(_valueForKeyFakeAssocArray "title_tag" "${option[*]}")"
if [[ "$(_valueForKeyFakeAssocArray "list_style" "${option[*]}")" == true ]]; then if [[ "$(_valueForKeyFakeAssocArray "list_style" "${option[*]}")" == true ]]; then
if [[ "$(_valueForKeyFakeAssocArray "list_all" "${option[*]}")" == true ]]; then if [[ "$(_valueForKeyFakeAssocArray "list_all" "${option[*]}")" == true ]]; then
@ -562,7 +549,7 @@ main() {
fi fi
if [[ -z "$changelog" ]]; then if [[ -z "$changelog" ]]; then
changelog="$(find . -mindepth 1 -maxdepth 1 \( -iname '*change*' -o -iname '*history*' \) | head -n1)" changelog="$(ls | grep -E 'change|history' -i | head -n1)"
if [[ -z "$changelog" ]]; then if [[ -z "$changelog" ]]; then
changelog="History.md"; changelog="History.md";
fi fi
@ -583,7 +570,7 @@ main() {
rm -f "$tmpfile" rm -f "$tmpfile"
if [[ -n "$GIT_EDITOR" ]]; then if [[ -n "$GIT_EDITOR" ]]; then
git_editor "$changelog" || _exit $GIT_EDITOR "$changelog" || _exit
else else
less "$changelog" || _exit less "$changelog" || _exit
fi fi

View file

@ -2,7 +2,7 @@
PROGNAME="git-clear" PROGNAME="git-clear"
FORCE=0 FORCE=0
_usage() { function _usage() {
cat << EOF cat << EOF
usage: $PROGNAME options usage: $PROGNAME options
usage: $PROGNAME -h|help|? usage: $PROGNAME -h|help|?
@ -32,12 +32,12 @@ done
# Only wait for answer if not forced by user # Only wait for answer if not forced by user
if [[ $FORCE == 0 ]]; then if [[ $FORCE == 0 ]]; then
echo -n "Sure? - THIS COMMAND MAY DELETE FILES THAT CANNOT BE RECOVERED, including those in .gitignore [y/N]: " echo -n "Sure? - This command may delete files that cannot be recovered, including those in .gitignore [y/N]: "
read -r clean read -r clean
else else
clean=y clean=y
fi fi
if [ "$clean" = "y" ]; then if [ "$clean" == "y" ]; then
git clean -d -f -x && git reset --hard git clean -d -f -x && git reset --hard
fi fi

View file

@ -1,7 +1,7 @@
#!/usr/bin/env bash #!/usr/bin/env bash
echo -n "Sure? - This command may delete files that cannot be recovered. Files and directories in .gitignore will be preserved [y/N]: " echo -n "Sure? - This command may delete files that cannot be recovered. Files and directories in .gitignore will be preserved [y/N]: "
read -r answer read -r ans
if [ "$answer" = "y" ] if [ "$ans" == "y" ]
then git clean -d -f && git reset --hard then git clean -d -f && git reset --hard
fi fi

View file

@ -1,36 +1,6 @@
#!/usr/bin/env bash #!/usr/bin/env bash
REF="" SINCE="last week"
SINCE="" test $# -ne 0 && SINCE=$*
echo "... commits since $SINCE" >&2
while [[ $# -gt 0 ]]; do git log --pretty='%an - %s' --after="@{$SINCE}"
case "$1" in
-r|--ref)
if [[ -z "$2" ]]; then
echo "error: option $1 requires an argument" >&2
exit 1
fi
REF="$2"
shift
shift
;;
*)
# non-flag args accumulation, e.g. "last " + "week" -> "last week"
SINCE="${SINCE:+$SINCE }$1"
shift
;;
esac
done
if [[ -n "$REF" && -n "$SINCE" ]]; then
echo "error: '--ref <ref>' and '<date>' are mutually exclusive" >&2
exit 1
fi
SINCE="${SINCE:-last week}"
if [[ -n "$REF" ]]; then
git log --pretty='%h %an - %s' "$REF..HEAD"
else
git log --pretty='%h %an - %s' --after="@{$SINCE}"
fi

View file

@ -1 +0,0 @@
git-abort

View file

@ -38,41 +38,30 @@ else
exit 40 exit 40
fi fi
if [[ "$DESTINATION_FILENAME" == */ ]]; then echo "Coping $CURRENT_FILENAME into $DESTINATION_FILENAME"
echo 1>&2 "$DESTINATION_FILENAME is not a file path."
exit 80
fi
if [[ "$DESTINATION_FILENAME" == */* ]]; then
DESTINATION_DIR="${DESTINATION_FILENAME%/*}"
if ! mkdir -p "$DESTINATION_DIR"; then
echo 1>&2 "Failed to create destination directory: $DESTINATION_DIR"
exit 160
fi
fi
INTERMEDIATE_FILENAME="${CURRENT_FILENAME//\//__}-move-to-${DESTINATION_FILENAME//\//__}"
echo "Copying $CURRENT_FILENAME into $DESTINATION_FILENAME" # We keep the existing file on the side in a commit
git mv "${CURRENT_FILENAME}" "${INTERMEDIATE_FILENAME}"
git commit -nm "Keep $CURRENT_FILENAME"
# Pre-check that the source and destination will work # We come back to the previous state and revert that change
git mv --dry-run "${CURRENT_FILENAME}" "${DESTINATION_FILENAME}" INTERMEDIATE_SAVED=$(git rev-parse HEAD)
git reset --hard HEAD^
# Make a new branch and switch to it # We move the file to its new destination
BRANCH_NAME="git-cp-$(date +%s)"
git checkout -b "$BRANCH_NAME"
# Move the original file to the new destination, in this branch
git mv "${CURRENT_FILENAME}" "${DESTINATION_FILENAME}" git mv "${CURRENT_FILENAME}" "${DESTINATION_FILENAME}"
git commit -nm "--Duplicate $CURRENT_FILENAME history into $DESTINATION_FILENAME" git commit -nm "Copy $CURRENT_FILENAME into $DESTINATION_FILENAME"
# Restore the original file to keep it in the history # We come back to the previous state and revert that change again
git checkout HEAD~ "${CURRENT_FILENAME}" DESTINATION_SAVED=$(git rev-parse HEAD)
git commit -nm "--Restore $CURRENT_FILENAME" git reset --hard HEAD^
# Switch to the original branch and merge this back in. # We keep both files
git checkout - git merge "${DESTINATION_SAVED}" "${INTERMEDIATE_SAVED}" -m "Duplicate ${CURRENT_FILENAME} history."
git merge --no-ff "$BRANCH_NAME" -m "Copy $CURRENT_FILENAME into $DESTINATION_FILENAME"
# We're now done with the branch, so delete it. # We get back our original name
# We shouldn't need -D here, as we've already merged it back in. git mv "${INTERMEDIATE_FILENAME}" "${CURRENT_FILENAME}"
git branch -d "$BRANCH_NAME" git commit -nm "Set back ${CURRENT_FILENAME} file"
fi fi

View file

@ -39,7 +39,7 @@ then
REMOTE=origin REMOTE=origin
fi fi
test -z "$BRANCH" && echo "branch argument required." 1>&2 && exit 1 test -z $BRANCH && echo "branch argument required." 1>&2 && exit 1
if [[ -n $REMOTE ]] if [[ -n $REMOTE ]]
then then

View file

@ -1,60 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
dry_run=false
force=false
prune=false
while [[ $# -gt 0 ]]; do
case "$1" in
-n|--dry-run)
dry_run=true
shift
;;
-f|--force)
force=true
shift
;;
-p|--prune)
prune=true
shift
;;
*)
echo "Unknown option: $1"
echo "Usage: git delete-gone-branches [-n|--dry-run] [-f|--force] [-p|--prune]"
exit 1
;;
esac
done
if [ "$prune" = true ]; then
git fetch --prune
fi
gone_branches=$(git for-each-ref --format \
'%(if:equals=gone)%(upstream:track,nobracket)%(then)%(refname:short)%(end)' refs/heads/ | sed '/^$/d')
if [ -z "$gone_branches" ]; then
echo "No branches with a gone remote found."
exit 0
fi
if [ "$dry_run" = true ]; then
echo "Would delete the following branches:"
echo "$gone_branches"
exit 0
fi
echo "The following branches will be deleted:"
echo "$gone_branches"
if [ "$force" = false ]; then
read -r -p "Delete these branches? [y/N] " confirm
if [[ ! "$confirm" =~ ^[yY]$ ]]; then
echo "Aborted."
exit 0
fi
fi
echo "$gone_branches" | xargs git branch -D

View file

@ -3,5 +3,5 @@
branches=$(git branch --no-color --merged | grep -vE "^(\*|\+)" | grep -v "$(git_extra_default_branch)" | grep -v svn) branches=$(git branch --no-color --merged | grep -vE "^(\*|\+)" | grep -v "$(git_extra_default_branch)" | grep -v svn)
if [ -n "$branches" ] if [ -n "$branches" ]
then then
echo "$branches" | xargs git branch -d echo "$branches" | xargs -n 1 git branch -d
fi fi

View file

@ -2,12 +2,6 @@
set -euo pipefail set -euo pipefail
proceed=false
if [[ $# -gt 0 && ("$1" == "--proceed" || "$1" == "-p") ]]; then
proceed=true
shift
fi
if [[ $# -eq 0 ]]; then if [[ $# -eq 0 ]]; then
targetBranch=$(git rev-parse --abbrev-ref HEAD) targetBranch=$(git rev-parse --abbrev-ref HEAD)
else else
@ -19,10 +13,6 @@ git for-each-ref refs/heads/ "--format=%(refname:short)" | while read -r branch;
mergeBase=$(git merge-base "$targetBranch" "$branch") mergeBase=$(git merge-base "$targetBranch" "$branch")
if [[ $(git cherry "$targetBranch" "$(git commit-tree "$(git rev-parse "$branch^{tree}")" -p "$mergeBase" -m _)") == "-"* ]]; then if [[ $(git cherry "$targetBranch" "$(git commit-tree "$(git rev-parse "$branch^{tree}")" -p "$mergeBase" -m _)") == "-"* ]]; then
if [[ $proceed == true ]]; then git branch -D "$branch"
git branch -D "$branch" || true
else
git branch -D "$branch"
fi
fi fi
done done

View file

@ -1,7 +1,7 @@
#!/usr/bin/env bash #!/usr/bin/env bash
VERSION="7.6.0-dev" VERSION="7.0.0"
INSTALL_SCRIPT="https://raw.githubusercontent.com/tj/git-extras/main/install.sh" INSTALL_SCRIPT="https://raw.githubusercontent.com/tj/git-extras/master/install.sh"
update() { update() {
local bin="$(command -v git-extras)" local bin="$(command -v git-extras)"

View file

@ -6,30 +6,22 @@ if [ -z "$branch_prefix" ]; then
branch_prefix="feature" branch_prefix="feature"
fi fi
branch_separator=$(git config --get git-extras.feature.separator)
if [ -z "$branch_separator" ]; then
branch_separator="/"
fi
merge_mode="--no-ff" merge_mode="--no-ff"
finish=false
declare -a argv declare -a argv
while test $# != 0 while test $# != 0
do do
case $1 in case $1 in
-a|--alias ) -a|--alias )
if [[ -n $2 ]] && [[ $2 != -- ]] if [[ -n $2 ]]
then then
shift # shift -a|-alias shift # shift -a|-alias
branch_prefix=$1 branch_prefix=$1
else else
echo >&2 "option $1 requires a value" argv+=("$1") # treat tail '-a' as <name>
exit 1
fi fi
;; ;;
-r|--remote ) -r|--remote )
if [[ -n $2 ]] && [[ $2 != -- ]] if [[ -n $2 ]]
then then
remote=$2 remote=$2
shift shift
@ -37,16 +29,6 @@ do
remote="origin" remote="origin"
fi fi
;; ;;
-s|--separator )
if [[ -n $2 ]] && [[ $2 != -- ]]
then
branch_separator=$2
shift
else
echo >&2 "option $1 requires a value"
exit 1
fi
;;
--squash ) --squash )
merge_mode="--squash" merge_mode="--squash"
;; ;;
@ -54,15 +36,6 @@ do
start_point=$2 start_point=$2
shift shift
;; ;;
-- )
# terminate argument parsing
shift
argv+=("$@")
break
;;
finish )
finish=true
;;
* ) * )
argv+=("$1") argv+=("$1")
;; ;;
@ -72,17 +45,21 @@ done
concatargs() { concatargs() {
str=$(IFS='-'; echo "$*") str=$(IFS='-'; echo "$*")
branch="$branch_prefix$branch_separator$str" branch="$branch_prefix"/$str
} }
test -z "${argv[0]}" && echo "$branch_prefix" "<name> required." 1>&2 && exit 1 if test "${argv[0]}" = "finish"; then
test -z "${argv[1]}" && echo "$branch_prefix" "<name> required." 1>&2 && exit 1
concatargs "${argv[@]}" branch="$branch_prefix"/"${argv[1]}"
if "${finish}"
then
git merge ${merge_mode} "$branch" && git delete-branch "$branch" git merge ${merge_mode} "$branch" && git delete-branch "$branch"
else else
test -z "${argv[0]}" && echo "$branch_prefix" "<name> required." 1>&2 && exit 1
if test -n "${argv[1]}"; then
concatargs "${argv[@]}"
else
branch="$branch_prefix"/"${argv[0]}"
fi
if [[ -n $remote ]] && [[ -z $start_point ]] if [[ -n $remote ]] && [[ -z $start_point ]]
then then
git create-branch -r "$remote" "$branch" git create-branch -r "$remote" "$branch"

View file

@ -91,8 +91,7 @@ main() {
git reset --hard "origin/${branch}" git reset --hard "origin/${branch}"
# Delete all other branches # Delete all other branches
# shellcheck disable=SC2063 branches=$(git branch | grep -v \* | xargs)
branches=$(git branch | grep -v '*' | xargs)
if [ -n "${branches}" ]; then if [ -n "${branches}" ]; then
git branch -D "${branches}" git branch -D "${branches}"
fi fi

View file

@ -17,9 +17,9 @@ read -r user
# personal access token # personal access token
# config name is github-personal-access-token '_' is not allowed in git config # config name is github-personal-access-token '_' is not allowed in git config
github_personal_access_token=$(git config --default "$GITHUB_TOKEN" git-extras.github-personal-access-token) github_personal_access_token=$(git config git-extras.github-personal-access-token)
test -z "$github_personal_access_token" && abort "GITHUB_TOKEN, or git config git-extras.github-personal-access-token required" test -z "$github_personal_access_token" && abort "git config git-extras.github-personal-access-token required"
# extract owner + project from repo url # extract owner + project from repo url
project=${url##*/} project=${url##*/}
@ -61,7 +61,7 @@ else
# clone forked repo into current dir # clone forked repo into current dir
git clone "${remote_prefix}${user}/${project}.git" "$project" git clone "${remote_prefix}${user}/${project}.git" "$project"
# add reference to origin fork so can merge in upstream changes # add reference to origin fork so can merge in upstream changes
cd "$project" || exit cd "$project"
git remote add upstream "${remote_prefix}${owner}/${project}.git" git remote add upstream "${remote_prefix}${owner}/${project}.git"
git fetch upstream git fetch upstream
fi fi

View file

@ -1,40 +0,0 @@
#!/usr/bin/env bash
_usage() {
printf '%s\n' "usage: ${0##*/} <url>
usage: ${0##*/} --help
Clone a repository in a particular directory."
}
if (( $# == 0 )); then
_usage
exit 0
fi
for arg; do
if [ "$arg" = '-h' ] || [ "$arg" = '--help' ]; then
_usage
exit 0
fi
done
url=$1
if ! shift; then
printf 'ERROR: Failed to shift' >&2
exit 1
fi
clone_path=$(git config --get git-extras.get.clone-path)
if [ -z "$clone_path" ]; then
printf 'ERROR: %s\n' "Git configuration key 'git-extras.get.clone-path' must be set to a directory to clone under" >&2
exit 1
fi
dirname=${url%/}
dirname=${dirname%.git}
dirname=${dirname##*/}
mkdir -p "$clone_path"
git clone "$url" "$clone_path/$dirname" "$@"

View file

@ -31,7 +31,7 @@ do
esac esac
done done
cd "$(git-root)" || exit # cd for git blame cd "$(git-root)" # cd for git blame
MERGED_LOG=$(git_extra_mktemp) MERGED_LOG=$(git_extra_mktemp)
if [[ $EMAIL == '-e' ]] if [[ $EMAIL == '-e' ]]
then then
@ -44,11 +44,9 @@ for file in $(git diff --name-only "$@")
do do
test -n "$DEBUG" && echo "git blame $file" test -n "$DEBUG" && echo "git blame $file"
# $1 - since $2 - until # $1 - since $2 - until
# shellcheck disable=SC2086
git blame $NOT_WHITESPACE --line-porcelain "$1" -- "$file" 2> /dev/null | git blame $NOT_WHITESPACE --line-porcelain "$1" -- "$file" 2> /dev/null |
LC_ALL=C sed -n "$PATTERN" | sort | uniq -c | LC_ALL=C sed 's/^\(.\)/- \1/' >> "$MERGED_LOG" LC_ALL=C sed -n "$PATTERN" | sort | uniq -c | LC_ALL=C sed 's/^\(.\)/- \1/' >> "$MERGED_LOG"
# if $2 not given, use current commit as "until" # if $2 not given, use current commit as "until"
# shellcheck disable=SC2086
git blame $NOT_WHITESPACE --line-porcelain "${2-@}" -- "$file" 2> /dev/null | git blame $NOT_WHITESPACE --line-porcelain "${2-@}" -- "$file" 2> /dev/null |
LC_ALL=C sed -n "$PATTERN" | sort | uniq -c | LC_ALL=C sed 's/^\(.\)/+ \1/' >> "$MERGED_LOG" LC_ALL=C sed -n "$PATTERN" | sort | uniq -c | LC_ALL=C sed 's/^\(.\)/+ \1/' >> "$MERGED_LOG"
done done
@ -73,7 +71,7 @@ END {
printf("%d %s\n", contributors[people], people) printf("%d %s\n", contributors[people], people)
} }
} }
}' "$MERGED_LOG" | sort -nr | # only gawk supports built-in sort function }' $MERGED_LOG | sort -nr | # only gawk supports built-in sort function
while read -r line while read -r line
do do
people=${line#* } people=${line#* }
@ -89,7 +87,7 @@ do
do do
printf "+" printf "+"
done done
printf "(%s)" "$num" printf "(%s)" $num
else else
for (( i = 0; i < num; i++ )) for (( i = 0; i < num; i++ ))
do do
@ -105,7 +103,7 @@ do
do do
printf "-" printf "-"
done done
printf "(%s)" "$num" printf "(%s)" $num
else else
for (( i = 0; i > num; i-- )) for (( i = 0; i > num; i-- ))
do do

View file

@ -1,28 +1,8 @@
#!/usr/bin/env bash #!/usr/bin/env bash
GIT_DIR=$(git rev-parse --git-dir 2>/dev/null) : ${GIT_DIR:=$(git rev-parse --git-dir)}
# awk script that takes 2 input files. The first one is newline deilmeted function show_contents {
# string of patterns to look for, second one is the file to remove them from.
# outfile has to be passed with -v upon call and is the file result is
# written to.
read -r -d '' AWK_SCRIPT <<'EOF'
# process the first "file" (newline split argument list)
NR==FNR { a[b++]=$0; next; }
# process file
{
found=0;
for (i=0; i != b; i++) {
if (a[i] == $0) { found=1; }
}
if (found == 1) { print "... removing '"$0"'"; }
else { print $0 > outfile }
}
EOF
show_contents() {
local file="${2/#~/$HOME}" local file="${2/#~/$HOME}"
if [ -f "$file" ]; then if [ -f "$file" ]; then
echo "$1 gitignore: $2" && cat "$file" echo "$1 gitignore: $2" && cat "$file"
@ -31,41 +11,18 @@ show_contents() {
fi fi
} }
cd_to_git_root() { function global_ignore() {
local error_level="$1" git config --global core.excludesFile || \
([ -n "$XDG_CONFIG_HOME" ] && echo "$XDG_CONFIG_HOME/git/ignore") || \
if ! git rev-parse --git-dir &>/dev/null; then echo "$HOME/.config/git/ignore"
if [ "$error_level" = '--warn' ]; then
echo "Warning: Not currently in a Git repository" >&2
elif [ "$error_level" = '--error' ]; then
echo "Error: Not currently in a Git repository" >&2
exit 1
fi
fi
local result=
if result=$(git rev-parse --show-toplevel 2>/dev/null); then
cd "$result" || exit
fi
} }
global_ignore() { function show_global {
if ! git config --global core.excludesFile 2>/dev/null; then
if [ -f "$HOME/.gitignore" ]; then
echo "$HOME/.gitignore"
else
echo "${XDG_CONFIG_HOME:-$HOME/.config}/git/ignore"
fi
fi
}
show_global() {
show_contents Global "$(global_ignore)" show_contents Global "$(global_ignore)"
} }
add_global() { function add_global {
local global_gitignore local global_gitignore="$(global_ignore)"
global_gitignore="$(global_ignore)"
if [ -z "$global_gitignore" ]; then if [ -z "$global_gitignore" ]; then
echo "Can't find global .gitignore." echo "Can't find global .gitignore."
echo "" echo ""
@ -76,28 +33,28 @@ add_global() {
fi fi
} }
show_local() { function show_local {
cd_to_git_root --warn cd "$(git root)"
show_contents Local .gitignore show_contents Local .gitignore
} }
add_local() { function add_local {
cd_to_git_root --warn cd "$(git root)"
add_patterns .gitignore "$@" add_patterns .gitignore "$@"
} }
show_private() { function show_private {
cd_to_git_root --error cd "$(git root)"
show_contents Private "${GIT_DIR}/info/exclude" show_contents Private "${GIT_DIR}/info/exclude"
} }
add_private() { function add_private {
cd_to_git_root --error cd "$(git root)"
test -d "${GIT_DIR}/info" || mkdir -p "${GIT_DIR}/info" test -d "${GIT_DIR}/info" || mkdir -p "${GIT_DIR}/info"
add_patterns "${GIT_DIR}/info/exclude" "$@" add_patterns "${GIT_DIR}/info/exclude" "$@"
} }
add_patterns() { function add_patterns {
echo "Adding pattern(s) to: $1" echo "Adding pattern(s) to: $1"
local file="${1/#~/$HOME}" local file="${1/#~/$HOME}"
dir_name=$(dirname "$file") dir_name=$(dirname "$file")
@ -114,66 +71,6 @@ add_patterns() {
done done
} }
edit_file() {
local file="${2/#~/$HOME}"
if [ -f "$file" ]; then
echo "Editing $1 gitignore: ($2)" && eval "$(git var GIT_EDITOR) $(printf '%q' "$file")"
echo "Done."
else
echo "There is no $1 .gitignore yet." >&2
exit 1
fi
}
_usage() {
cat << EOF
Usage: git ignore [OPTION]... [PATTERN]...
Modify or display local global or private gitignore files.
OPTIONs set context (local, global, private) and action (display, add,
remove, edit). In case of collision, last flag overwrites preceding ones.
Defaults are: local context, action is display (see man git ignore for
more details).
Context examples:
local: .../repo/.gitignore
private: .../repo/.git/info/exclude
global: \$HOME/.gitignore
PATTERNs are the gitignore patterns as specified in git documentation.
Options:
-l, --local Set context to local gitignore
-g, --global Set context to global gitignore
-p, --private Set context to private gitignore
-e, --edit Set action to edit
-r, --remove Set action to remove
-h, --help Print this message
-- End of options delimiter
EOF
}
remove_patterns() {
declare -a args
local tmpfile
args=( "${@:3}" )
local file="${2/#~/$HOME}"
if [ -f "$file" ]; then
tmpfile="$(mktemp -q "${TMPDIR:-/tmp}"/git-extras-ignore.XXXXXX 2>/dev/null)"
echo "Removing patterns from $1 gitignore: $2"
awk -v outfile="$tmpfile" "${AWK_SCRIPT}"\
<(printf '%s\n' "${args[@]}") "$file"
cat "$tmpfile" > "$file"
rm "$tmpfile"
else
echo "There is no $1 .gitignore yet"
exit 1
fi
}
# can have only 1 action and 1 level, if conflicting flags are passed
# latter ones overwrite former
# sanity of args not tested (e.g. there should be no args if -e is supplied)
if test $# -eq 0; then if test $# -eq 0; then
show_global show_global
echo "---------------------------------" echo "---------------------------------"
@ -181,105 +78,22 @@ if test $# -eq 0; then
echo "---------------------------------" echo "---------------------------------"
show_private show_private
else else
# parse flags and args case "$1" in
level="none" -l|--local)
action="none" test $# -gt 1 && add_local "${@:2}" && echo
declare -a args show_local
while [ $# -gt 0 ]; do ;;
case "$1" in -g|--global)
-h|--help) test $# -gt 1 && add_global "${@:2}" && echo
_usage show_global
exit 0 ;;
;; -p|--private)
-l|--local) test $# -gt 1 && add_private "${@:2}" && echo
level="local" show_private
;; ;;
-g|--global) *)
level="global" add_local "$@"
;; ;;
-p|--private) esac
level="private"
;;
-e|--edit)
action="edit"
;;
-r|--remove)
action="remove"
;;
--)
shift
args+=("$@")
break
;;
*)
args+=("$1")
;;
esac
shift
done
# compatible with previous version
if [ "$action" = "none" ]; then
case "$level" in
local)
test ${#args[@]} -ne 0 && add_local "${args[@]}" && echo
show_local
;;
global)
test ${#args[@]} -ne 0 && add_global "${args[@]}" && echo
show_global
;;
private)
test ${#args[@]} -ne 0 && add_private "${args[@]}" && echo
show_private
;;
none)
add_local "${args[@]}"
# maybe show_local here too?
;;
esac
exit 0
# open file in editor
elif [ "$action" = "edit" ]; then
case "$level" in
local|none)
cd_to_git_root --warn
edit_file 'local' .gitignore && echo
;;
global)
global_gitignore="$(global_ignore)"
edit_file global "$global_gitignore" && echo
;;
private)
cd_to_git_root --error
test -d "${GIT_DIR}/info" || mkdir -p "${GIT_DIR}/info"
edit_file private "${GIT_DIR}/info/exclude" && echo
;;
esac
exit 0
# remove entries
else
if [ ${#args[@]} -eq 0 ]; then
echo "Nothing to remove."
exit 0
fi
case "$level" in
local|none)
cd_to_git_root --warn
remove_patterns 'local' .gitignore "${args[@]}" && echo
show_local
;;
global)
global_gitignore="$(global_ignore)"
remove_patterns global "$global_gitignore" "${args[@]}" && echo
show_global
;;
private)
cd_to_git_root --error
remove_patterns private "${GIT_DIR}/info/exclude" "${args[@]}" && echo
show_private
;;
esac
exit 0
fi
fi fi

View file

@ -30,7 +30,7 @@ while getopts "m:eapfh" arg; do
PUSH=true PUSH=true
;; ;;
f) f)
FORCE='--force-with-lease' FORCE='-f'
;; ;;
h) h)
echo "$USAGE" echo "$USAGE"

View file

@ -18,7 +18,7 @@ then
git stash git stash
fi fi
if [ "${!#}" = '--ff-only' ]; then if [ "${!#}" == '--ff-only' ]; then
case $# in case $# in
2 ) # dest --ff 2 ) # dest --ff
git push "$(git rev-parse --show-toplevel)" "$cur_branch":"$1";; git push "$(git rev-parse --show-toplevel)" "$cur_branch":"$1";;

View file

@ -1,7 +1,7 @@
#!/usr/bin/env bash #!/usr/bin/env bash
usage() { usage() {
echo 1>&2 "usage: git missing [<first branch>] <second branch> [<git log options>] [[--] <path>...]" echo 1>&2 "usage: git missing [<first branch>] <second branch> [<git log options>]"
} }
if [ "${#}" -lt 1 ] if [ "${#}" -lt 1 ]
@ -12,20 +12,9 @@ fi
declare -a git_log_args=() declare -a git_log_args=()
declare -a branches=() declare -a branches=()
declare -a pathspec=()
declare parse_path=false
for arg in "$@" ; do for arg in "$@" ; do
if [[ $parse_path == true ]]; then
pathspec+=("$@")
break
fi
case "$arg" in case "$arg" in
--)
parse_path=true
;;
--*) --*)
git_log_args+=( "$arg" ) git_log_args+=( "$arg" )
;; ;;
@ -49,4 +38,4 @@ else
exit 1 exit 1
fi fi
git log "${git_log_args[@]}" "$firstbranch"..."$secondbranch" --format="%m %h %s" --left-right -- "${pathspec[@]}" git log "${git_log_args[@]}" "$firstbranch"..."$secondbranch" --format="%m %h %s" --left-right

View file

@ -7,8 +7,6 @@ if [ -z "${1-}" ] ; then
exit 1 exit 1
fi fi
remote_ref_kind=merge-requests
if test "$1" = "clean"; then if test "$1" = "clean"; then
git for-each-ref refs/heads/mr/* --format='%(refname)' | while read -r ref; do git for-each-ref refs/heads/mr/* --format='%(refname)' | while read -r ref; do
git branch -D "${ref#refs/heads/}" git branch -D "${ref#refs/heads/}"
@ -17,19 +15,13 @@ if test "$1" = "clean"; then
elif [[ $1 =~ ^(https?://[^/]+/(.+))/merge_requests/([0-9]+).*$ ]]; then elif [[ $1 =~ ^(https?://[^/]+/(.+))/merge_requests/([0-9]+).*$ ]]; then
remote=${BASH_REMATCH[1]}.git remote=${BASH_REMATCH[1]}.git
id=${BASH_REMATCH[3]} id=${BASH_REMATCH[3]}
elif [[ $1 =~ ^(https?://[^/]+/(.+))/pulls/([0-9]+).*$ ]]; then
# Forgejo/Codeberg pull request URL, e.g.
# https://codeberg.org/owner/repository/pulls/453
remote=${BASH_REMATCH[1]}.git
id=${BASH_REMATCH[3]}
remote_ref_kind=pull
else else
id=$1 id=$1
remote=${2:-origin} remote=${2:-origin}
fi fi
branch=mr/$id branch=mr/$id
remote_ref=refs/$remote_ref_kind/$id/head remote_ref=refs/merge-requests/$id/head
git fetch -fu "$remote" "$remote_ref:$branch" git fetch -fu "$remote" "$remote_ref:$branch"
git checkout "$branch" git checkout "$branch"
git config --local --replace "branch.$branch.merge" "$remote_ref" git config --local --replace "branch.$branch.merge" "$remote_ref"

View file

@ -9,15 +9,15 @@ do
file="$file"' '"$i" file="$file"' '"$i"
shift shift
done done
test -n "$*" && range=("$@") test -n "$*" && range="$*"
test -z "$file" && echo "file required." 1>&2 && exit 1 test -z "$file" && echo "file required." 1>&2 && exit 1
if [ -z "${range[*]}" ] if [ -z "$range" ]
then then
git filter-branch -f --index-filter "git rm -r --cached ""$file"" --ignore-unmatch" \ git filter-branch -f --index-filter "git rm -r --cached ""$file"" --ignore-unmatch" \
--prune-empty --tag-name-filter cat -- --all --prune-empty --tag-name-filter cat -- --all
else else
# $range is an array so that we can forward multiple rev-list arguments # don't quote $range so that we can forward multiple rev-list arguments
git filter-branch -f --index-filter "git rm -r --cached ""$file"" --ignore-unmatch" \ git filter-branch -f --index-filter "git rm -r --cached ""$file"" --ignore-unmatch" \
--prune-empty --tag-name-filter cat -- "${range[@]}" --prune-empty --tag-name-filter cat -- $range
fi fi

View file

@ -2,7 +2,7 @@
set -e set -e
set -o pipefail set -o pipefail
if ! command -v pastebinit &>/dev/null; then if ! command -v pastebinit >/dev/null 2>&1; then
echo >&2 "To run 'git paste', you need to install pastebinit in your system" echo >&2 "To run 'git paste', you need to install pastebinit in your system"
exit 1 exit 1
fi fi

View file

@ -5,7 +5,7 @@ SECONDARY_BRANCH=""
FF="--ff" FF="--ff"
CONTINUE="no" CONTINUE="no"
current_branch() { function current_branch() {
git rev-parse --abbrev-ref HEAD git rev-parse --abbrev-ref HEAD
} }
@ -50,13 +50,15 @@ fi
if [[ "$CONTINUE" == "yes" ]]; then if [[ "$CONTINUE" == "yes" ]]; then
TARGET_BRANCH=$(current_branch) TARGET_BRANCH=$(current_branch)
SECONDARY_BRANCH=${TARGET_BRANCH%"-rebased-on-top-of-"*} set "$(echo "$TARGET_BRANCH" | sed -e "s/-rebased-on-top-of-/\n/g")"
PRIMARY_BRANCH=${TARGET_BRANCH#*"-rebased-on-top-of-"} if [[ $# != 2 ]]; then
if [[ "${SECONDARY_BRANCH}-rebased-on-top-of-${PRIMARY_BRANCH}" != $TARGET_BRANCH ]]; then
echo "Couldn't continue rebasing on ${TARGET_BRANCH}" echo "Couldn't continue rebasing on ${TARGET_BRANCH}"
exit 30 # Impossible to detect PRIMARY_BRANCH AND SECONDARY_BRANCH exit 30 # Impossible to detect PRIMARY_BRANCH AND SECONDARY_BRANCH
fi fi
SECONDARY_BRANCH=$1
PRIMARY_BRANCH=$2
echo "Continuing rebasing of $SECONDARY_BRANCH on top of $PRIMARY_BRANCH" echo "Continuing rebasing of $SECONDARY_BRANCH on top of $PRIMARY_BRANCH"
git commit || exit 51 git commit || exit 51
git branch -d "${SECONDARY_BRANCH}" || exit 52 git branch -d "${SECONDARY_BRANCH}" || exit 52
@ -71,9 +73,10 @@ else
git checkout "${PRIMARY_BRANCH}" || exit 41 git checkout "${PRIMARY_BRANCH}" || exit 41
git checkout -b "${TARGET_BRANCH}" || exit 42 git checkout -b "${TARGET_BRANCH}" || exit 42
git merge "${SECONDARY_BRANCH}" ${FF} \
-m "Psycho-rebased branch ${SECONDARY_BRANCH} on top of ${PRIMARY_BRANCH}"
if git merge "${SECONDARY_BRANCH}" ${FF} \ if [[ $? == 0 ]]; then
-m "Psycho-rebased branch ${SECONDARY_BRANCH} on top of ${PRIMARY_BRANCH}"; then
git branch -d "${SECONDARY_BRANCH}" || exit 43 git branch -d "${SECONDARY_BRANCH}" || exit 43
git branch -m "${TARGET_BRANCH}" "${SECONDARY_BRANCH}" || exit 44 git branch -m "${TARGET_BRANCH}" "${SECONDARY_BRANCH}" || exit 44
else else

View file

@ -31,9 +31,9 @@ EOF
# personal access token # personal access token
# config name is github-personal-access-token '_' is not allowed in git config # config name is github-personal-access-token '_' is not allowed in git config
github_personal_access_token=$(git config --default "$GITHUB_TOKEN" git-extras.github-personal-access-token) github_personal_access_token=$(git config git-extras.github-personal-access-token)
test -z "$github_personal_access_token" && abort "GITHUB_TOKEN or git config git-extras.github-personal-access-token required" test -z "$github_personal_access_token" && abort "git config git-extras.github-personal-access-token required"
# branch # branch
@ -43,7 +43,7 @@ if [ -z "$remote" ]; then
echo 'no upstream found, push to origin as default' echo 'no upstream found, push to origin as default'
remote="origin" remote="origin"
fi fi
[ "$remote" = "." ] && abort "the upstream should be a remote branch." [ "$remote" == "." ] && abort "the upstream should be a remote branch."
# make sure it's pushed # make sure it's pushed

View file

@ -20,7 +20,7 @@ cleanup() {
rm "$index" rm "$index"
exit 2 exit 2
} }
trap cleanup INT trap cleanup 2
# Go back in history while parent commits are available. # Go back in history while parent commits are available.
echo "Trying to find a commit the patch applies to..." echo "Trying to find a commit the patch applies to..."
@ -30,7 +30,7 @@ do
GIT_INDEX_FILE=$index git read-tree "$rev" GIT_INDEX_FILE=$index git read-tree "$rev"
# Try to apply the patch. # Try to apply the patch.
GIT_INDEX_FILE=$index git apply --cached "$1" &>/dev/null GIT_INDEX_FILE=$index git apply --cached "$1" >/dev/null 2>&1
patch_failed=$? patch_failed=$?
# Do it again, but show the error, if the problem is the patch itself. # Do it again, but show the error, if the problem is the patch itself.

View file

@ -119,7 +119,7 @@ if test $# -gt 0; then
fi fi
declare -a sign_args declare -a sign_args
if [ "$sign" = true ]; then if [ "$sign" == true ]; then
sign_args=("-s") sign_args=("-s")
fi fi

View file

@ -1,101 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
# Usage function
usage() {
cat <<EOF
Usage: git rename-file [OPTIONS] <source> <destination>
Description:
Rename a file or directory and ensure Git recognizes the change, regardless of filesystem case-sensitivity.
It combines the functionality of the "mv" command and "git mv". This is particularly useful for renaming files or directories
to change only their case, which might not be detected by Git on case-insensitive filesystems.
Options:
-h, --help Show this help message and exit.
Examples:
git rename-file old_filename new_filename
git rename-file old_directory new_directory
EOF
}
# Check for help option
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
usage
exit 0
fi
# Check for correct number of arguments
if [ "$#" -ne 2 ]; then
echo "Error: Incorrect number of arguments."
echo ""
usage >&2
exit 1
fi
# Assign variables
SOURCE="$1"
DESTINATION="$2"
TEMP_NAME="${SOURCE}.temp"
# Function to check if a file or directory exists in a case-sensitive manner
check_case_sensitive_exists() {
local path="$1"
local dir
local base
dir=$(dirname "$path")
base=$(basename "$path")
if [ -e "$dir" ]; then
if (cd "$dir" && find . -maxdepth 1 -name "$base" | grep -q "$base"); then
return 0
fi
fi
return 1
}
# Check if source exists and is under version control
if ! check_case_sensitive_exists "$SOURCE"; then
echo "Error: Source '$SOURCE' does not exist."
exit 1
fi
if ! git ls-files --error-unmatch "$SOURCE" > /dev/null 2>&1; then
echo "Error: Source '$SOURCE' is not under version control. If file or directory is new, it must at least be staged."
exit 1
fi
# Check if destination already exists
if check_case_sensitive_exists "$DESTINATION"; then
echo "Error: Destination '$DESTINATION' already exists."
exit 1
fi
# Check if the destination directory exists
DEST_DIR=$(dirname "$DESTINATION")
if ! check_case_sensitive_exists "$DEST_DIR"; then
echo "Error: Destination directory '$DEST_DIR' does not exist."
exit 1
fi
# Create a rollback function
rollback() {
echo "Rolling back changes..."
if [ -e "$TEMP_NAME" ]; then
git mv -f "$TEMP_NAME" "$SOURCE"
fi
}
# Trap errors to trigger rollback
trap 'rollback' ERR
# Move the file to a temporary name within the Git repository
git mv "$SOURCE" "$TEMP_NAME"
# Move the temporary file to the desired destination
git mv "$TEMP_NAME" "$DESTINATION"
echo "Successfully renamed '$SOURCE' to '$DESTINATION'."

View file

@ -1,25 +1,8 @@
#!/usr/bin/env bash #!/usr/bin/env bash
shopt -s extglob
git version git version
echo "git-extras version ""$(git-extras -v)" echo "git-extras version ""$(git-extras -v)"
echo "Type 'ls' to ls files below current directory; '!command' to execute any command or just 'subcommand' to execute any git subcommand; 'quit', 'exit', 'q', ^D, or ^C to exit the git repl." echo "type 'ls' to ls files below current directory, '!command' to execute any command or just 'subcommand' to execute any git subcommand"
HISTIGNORE=${HISTIGNORE:-+([[:space:]])}
HISTCONTROL=${HISTCONTROL:-ignoredups}
use_local_history=$(git config --get --default 'false' git-extras.repl.use-local-history)
if [[ "$use_local_history" == "true" ]]; then
HISTFILE="$(git rev-parse --show-toplevel)/.git_extras_repl_history"
else
HISTFILE=${XDG_STATE_HOME:-$HOME/.local/state}/git_extras_repl_history
fi
# file doesn't exist, is empty, or contains only whitespace
if [[ ! -f "$HISTFILE" ]] || [[ ! -s "$HISTFILE" ]] || ! grep -q '[^[:space:]]' "$HISTFILE"; then
# `history -r` .... `history -a` are not happy with an empty initial file in bash 3.2.57, which is what MacOS 26 ships with
echo '!echo welcome to git-repl!' >> "$HISTFILE"
fi
history -r
while true; do while true; do
# Current branch # Current branch
@ -27,73 +10,34 @@ while true; do
# Prompt # Prompt
if test -n "$cur"; then if test -n "$cur"; then
cur_string=" ($cur)" prompt="git ($cur)> "
else else
cur_string="" prompt="git> "
fi
if test -n "$exit_status" && test "$exit_status" -ne 0; then
es_string=$' \e[31m['"$exit_status"$']\e[0m'
else
es_string=""
fi
prompt_character=$(git config --get --default '>' git-extras.repl.prompt-character)
prefix=$(git config --get --default 'git' git-extras.repl.prefix)
show_project_name=$(git config --get --default 'false' git-extras.repl.show-project-name)
if [[ "$show_project_name" == "true" ]]; then
project_name=" $(basename "$(git rev-parse --show-toplevel)" .git)"
else
project_name=""
fi fi
prompt_base="$prefix$project_name$cur_string$es_string$prompt_character" # Readline
prompt_base_stripped=$(echo "$prompt_base" | awk '{$1=$1};1') read -e -r -p "$prompt" cmd
prompt="$prompt_base_stripped "
# Use arguments as a command if any are provided. # EOF
if [ $# -ne 0 ]; then test $? -ne 0 && break
cmd=$*
set --
echo "$prompt" "$cmd" # It is as though you had entered a command.
else
# Readline
read -e -r -p "$prompt" cmd
# Check for EOF, and end the program if so (handles ^D).
test $? -ne 0 && break
fi
# Add command to history if it is not all whitespace # History
if [[ ! "$cmd" =~ ^[[:space:]]*$ ]]; then history -s "$cmd"
history -s "$cmd"
fi
# Built-in commands # Built-in commands
case $cmd in case $cmd in
ls) cmd=ls-files;; ls) cmd=ls-files;;
"") "") continue;;
on_enter_cmd=$(git config --get --default '' git-extras.repl.on-enter-command) quit|exit) break;;
if test -n "$on_enter_cmd"; then
cmd="$on_enter_cmd"
else
continue
fi
;;
quit|exit|q) break;;
esac esac
history -a
if [[ $cmd == !* ]]; then if [[ $cmd == !* ]]; then
# shellcheck disable=SC2086
eval ${cmd:1} eval ${cmd:1}
elif [[ $cmd == git* ]]; then elif [[ $cmd == git* ]]; then
# shellcheck disable=SC2086
eval $cmd eval $cmd
else else
eval git "$cmd" eval git "$cmd"
fi fi
exit_status=$?
done done
echo echo

View file

@ -59,7 +59,7 @@ function php_lint()
function _dos2unix() function _dos2unix()
{ {
command -v dos2unix > /dev/null && dos2unix "$@" command -v dos2unix > /dev/null && dos2unix $@
return 0 return 0
} }
@ -68,8 +68,8 @@ function _sanitize()
git config --get-all extras.scp.sanitize | while read -r i git config --get-all extras.scp.sanitize | while read -r i
do do
case $i in case $i in
php_lint) php_lint "$@";; # git config --global --add extras.scp.sanitize php_lint php_lint) php_lint $@;; # git config --global --add extras.scp.sanitize php_lint
dos2unix) _dos2unix "$@";; # git config --global --add extras.scp.sanitize dos2unix dos2unix) _dos2unix $@;; # git config --global --add extras.scp.sanitize dos2unix
esac esac
done done
return $? return $?
@ -77,22 +77,10 @@ function _sanitize()
function scp_and_stage function scp_and_stage
{ {
local verbose=0 interactive=0 dry_run=0
while :
do
case "$1" in
-v|--verbose) verbose=1; shift;;
-i|--interactive) verbose=1; interactive=1; shift;;
-n|--dry-run) verbose=1; dry_run=1; shift;;
*) break;;
esac
done
set_remote "$1" set_remote "$1"
shift shift
local refhead local refhead="$(git rev-parse --quiet --verify "$1")"
refhead="$(git rev-parse --quiet --verify "$1")"
if [ -n "$refhead" ] if [ -n "$refhead" ]
then then
shift shift
@ -105,116 +93,45 @@ function scp_and_stage
list=$(git ls-files "$@")" "$(git ls-files -o "$@") list=$(git ls-files "$@")" "$(git ls-files -o "$@")
elif [ -n "$refhead" ] elif [ -n "$refhead" ]
then then
[ "$verbose" -eq 1 ] && git --no-pager diff --stat "$refhead" git diff --stat "$refhead"
list=$(git diff "$refhead" --name-only) list=$(git diff "$refhead" --name-only)
else else
[ "$verbose" -eq 1 ] && git --no-pager diff git diff
list=$(git diff --name-only) list=$(git diff --name-only)
fi fi
deleted=$(for i in $list; do [ -f "$i" ] || echo "$i"; done) deleted=$(for i in $list; do [ -f "$i" ] || echo "$i"; done)
list=$(for i in $list; do [ -f "$i" ] && echo "$i"; done) list=$(for i in $list; do [ -f "$i" ] && echo "$i"; done)
if [ "$interactive" -eq 1 ] && [ "$dry_run" -eq 0 ] && { [ -n "$list" ] || [ -n "$deleted" ]; }
then
local reply
read -r -p "Proceed with sync to $remote? [y/N] " reply
case "$reply" in
y|Y|yes|YES) ;;
*) _info "Aborted, nothing synced."; exit 0;;
esac
fi
local status=0
if [ -n "$list" ] if [ -n "$list" ]
then then
local _TMP=${0///} local _TMP=${0///}
# shellcheck disable=SC2086 echo "$list" > "$_TMP" &&
echo "$list" > "$_TMP" _sanitize $list &&
if [ "$dry_run" -eq 1 ] || _sanitize $list _info "Pushing to $remote ($(git config "remote.$remote.url"))" &&
then rsync -rlDv --files-from="$_TMP" ./ "$(git config "remote.$remote.url")/" &&
_info "Pushing to $remote ($(git config "remote.$remote.url"))" git add --force $list &&
if [ "$dry_run" -eq 1 ]
then
rsync -rlDvn --files-from="$_TMP" ./ "$(git config "remote.$remote.url")/"
else
rsync -rlDv --files-from="$_TMP" ./ "$(git config "remote.$remote.url")/" &&
git add --force $list
fi
status=$?
else
status=1
fi
rm "$_TMP" rm "$_TMP"
fi fi
deleted=$(for i in $deleted; do echo "$(git config "remote.$remote.url" | cut -d: -f2)/$i"; done) deleted=$(for i in $deleted; do echo "$(git config "remote.$remote.url" | cut -d: -f2)/$i"; done)
if [ -n "$deleted" ] [ -n "$deleted" ] &&
then COLOR_RED &&
COLOR_RED echo Deleted remote files &&
echo Deleted remote files ssh "$(git config "remote.$remote.url" | cut -d: -f1)" -t "rm $deleted" &&
if [ "$dry_run" -eq 1 ] echo "$deleted"
then COLOR_RESET
echo "$deleted"
else
if ssh "$(git config "remote.$remote.url" | cut -d: -f1)" -t "rm $deleted"
then
echo "$deleted"
else
status=1
fi
fi
COLOR_RESET
fi
return "$status"
} }
function reverse_scp() function reverse_scp()
{ {
local verbose=0 interactive=0 dry_run=0
while :
do
case "$1" in
-v|--verbose) verbose=1; shift;;
-i|--interactive) verbose=1; interactive=1; shift;;
-n|--dry-run) verbose=1; dry_run=1; shift;;
*) break;;
esac
done
set_remote "$1" set_remote "$1"
shift shift
local _TMP=${0///} local _TMP=${0///}
echo "$@" > "$_TMP" echo $@ > "$_TMP" &&
rsync -rlDv --files-from="$_TMP" "$(git config "remote.$remote.url")/" ./ &&
local status=0
if [ "$verbose" -eq 1 ]
then
rsync -rlDvn --files-from="$_TMP" "$(git config "remote.$remote.url")/" ./
status=$?
fi
if [ "$dry_run" -eq 1 ]
then
rm "$_TMP"
return "$status"
fi
if [ "$interactive" -eq 1 ]
then
local reply
read -r -p "Proceed with copy from $remote? [y/N] " reply
case "$reply" in
y|Y|yes|YES) ;;
*) _info "Aborted, nothing copied."; rm "$_TMP"; exit 0;;
esac
fi
rsync -rlDv --files-from="$_TMP" "$(git config "remote.$remote.url")/" ./ &&
rm "$_TMP" rm "$_TMP"
} }
@ -229,14 +146,9 @@ function _usage()
{ {
echo "Usage: echo "Usage:
git scp -h|help|? git scp -h|help|?
git scp [options] <remote> [ref|file..] # scp and stage your files to specified remote git scp <remote> [ref|file..] # scp and stage your files to specified remote
git scp [options] <remote> [<ref>] # show diff relative to <ref> and upload unstaged files to <remote> git scp <remote> [<ref>] # show diff relative to <ref> and upload unstaged files to <remote>
git rscp [options] <remote> [<file|directory>] # copy <remote> files to current working directory git rscp <remote> [<file|directory>] # copy <remote> files to current working directory
OPTIONS:
-v, --verbose print what will be synced before syncing
-i, --interactive prompt for confirmation before syncing (implies --verbose)
-n, --dry-run show what would be synced, change nothing (implies --verbose; no staging, no remote writes/deletes)
" "
case $1 in case $1 in
@ -260,8 +172,8 @@ case $(basename "$0") in
git-scp) git-scp)
case $1 in case $1 in
''|-h|'?'|help|--help) shift; _test_git_scp; _usage "$@";; ''|-h|'?'|help|--help) shift; _test_git_scp; _usage "$@";;
*) scp_and_stage "$@";; *) scp_and_stage $@;;
esac esac
;; ;;
git-rscp) reverse_scp "$@";; git-rscp) reverse_scp $@;;
esac esac

View file

@ -2,7 +2,7 @@
COMMIT_MESSAGE='Initial commit' COMMIT_MESSAGE='Initial commit'
if [ "$1" = "-m" ]; then if [ "$1" == "-m" ]; then
COMMIT_MESSAGE=$2 COMMIT_MESSAGE=$2
shift; shift shift; shift
fi fi

View file

@ -35,7 +35,7 @@ in_git_repo=$?
# Use colors, but only if connected to a terminal, and that terminal # Use colors, but only if connected to a terminal, and that terminal
# supports them. # supports them.
if command -v tput &>/dev/null; then if command -v tput >/dev/null 2>&1; then
ncolors=$(tput colors) ncolors=$(tput colors)
fi fi
if [[ -t 1 ]] && [[ -n "$ncolors" ]] && [[ "$ncolors" -ge 8 ]] ; then if [[ -t 1 ]] && [[ -n "$ncolors" ]] && [[ "$ncolors" -ge 8 ]] ; then
@ -227,7 +227,7 @@ git_output() {
echo "" echo ""
fi fi
fi fi
# TODO optimize:return if the latest commit of a branch is earlier than the 'since' day # TODO optimize:return if the latest commit of a branch is eariler than the 'since' day
done done
else else
# shellcheck disable=SC2086 # shellcheck disable=SC2086
@ -240,8 +240,7 @@ if [[ $in_git_repo != 0 ]]; then
## Set delimiter to newline for the loop ## Set delimiter to newline for the loop
IFS=$'\n' IFS=$'\n'
## Recursively search for git repositories ## Recursively search for git repositories
# shellcheck disable=SC2086 PROJECT_DIRS=$(find "$INCLUDE_LINKS" . -maxdepth "$MAXDEPTH" -mindepth 0 -name .git)
PROJECT_DIRS=$(find $INCLUDE_LINKS . -maxdepth "$MAXDEPTH" -mindepth 0 -name .git)
# Fetch the latest commits, if required # Fetch the latest commits, if required
if [ "$FETCH_LAST_COMMIT" = true ]; then if [ "$FETCH_LAST_COMMIT" = true ]; then

View file

@ -3,16 +3,12 @@
cd "$(git root)" || { echo "Can't cd to top level directory";exit 1; } cd "$(git root)" || { echo "Can't cd to top level directory";exit 1; }
PROJECT_FULL_PATH=
SUMMARY_BY_LINE= SUMMARY_BY_LINE=
DEDUP_BY_EMAIL= DEDUP_BY_EMAIL=
MERGES_ARG= MERGES_ARG=
OUTPUT_STYLE= OUTPUT_STYLE=
for arg in "$@"; do for arg in "$@"; do
case "$arg" in case "$arg" in
--full-path)
PROJECT_FULL_PATH=1
;;
--line) --line)
SUMMARY_BY_LINE=1 SUMMARY_BY_LINE=1
;; ;;
@ -49,33 +45,30 @@ if [ -n "$MERGES_ARG" ] && [ -n "$SUMMARY_BY_LINE" ]; then
exit 1 exit 1
fi fi
commit="HEAD"
if [ -n "$SUMMARY_BY_LINE" ]; then if [ -n "$SUMMARY_BY_LINE" ]; then
paths=( "$@" ) paths=( "$@" )
else else
commit="HEAD"
[ $# -ne 0 ] && commit=$* [ $# -ne 0 ] && commit=$*
fi fi
project=${PWD##*/}
if [[ -n "$PROJECT_FULL_PATH" ]]; then
project=${PWD/${HOME}/\~}
else
project=${PWD##*/}
fi
# #
# get date for the given <commit> # get date for the given <commit>
# #
commit_date() { date() {
# the $1 can be empty # the $1 can be empty
# shellcheck disable=SC2086 # shellcheck disable=SC2086
git log $MERGES_ARG --pretty='format: %ai' "$1" | cut -d ' ' -f 2 git log $MERGES_ARG --pretty='format: %ai' $1 | cut -d ' ' -f 2
} }
# #
# get active days for the given <commit> # get active days for the given <commit>
# #
active_days() { active_days() {
commit_date "$1" | sort -r | uniq | awk ' # shellcheck disable=SC2086
date $1 | sort -r | uniq | awk '
{ sum += 1 } { sum += 1 }
END { print sum } END { print sum }
' '
@ -86,7 +79,7 @@ active_days() {
# #
commit_count() { commit_count() {
# shellcheck disable=SC2086 # shellcheck disable=SC2086
git rev-list $MERGES_ARG --count "$commit" git log $MERGES_ARG --oneline $commit | wc -l | tr -d ' '
} }
# #
@ -202,14 +195,14 @@ uncommitted_changes_count() {
} }
COLUMN_CMD_DELIMTER="¬" # Hopefully, this symbol is not used in branch names... I use it as a separator for columns COLUMN_CMD_DELIMTER="¬" # Hopefully, this symbol is not used in branch names... I use it as a seperator for columns
SP="$COLUMN_CMD_DELIMTER|" SP="$COLUMN_CMD_DELIMTER|"
print_summary_by_line() { print_summary_by_line() {
if [ "$OUTPUT_STYLE" = "tabular" ]; then if [ "$OUTPUT_STYLE" == "tabular" ]; then
tabular_headers="# Repo $SP Lines" tabular_headers="# Repo $SP Lines"
echo -e "$tabular_headers\n$project $SP $(line_count "${paths[@]}")" | column -t -s "$COLUMN_CMD_DELIMTER" echo -e "$tabular_headers\n$project $SP $(line_count "${paths[@]}")" | column -t -s "$COLUMN_CMD_DELIMTER"
elif [ "$OUTPUT_STYLE" = "oneline" ]; then elif [ "$OUTPUT_STYLE" == "oneline" ]; then
echo "$project / lines: $(line_count "${paths[@]}")" echo "$project / lines: $(line_count "${paths[@]}")"
elif [ -n "$SUMMARY_BY_LINE" ]; then elif [ -n "$SUMMARY_BY_LINE" ]; then
echo echo
@ -221,22 +214,24 @@ print_summary_by_line() {
} }
print_summary() { print_summary() {
if [ "$OUTPUT_STYLE" = "tabular" ]; then if [ "$OUTPUT_STYLE" == "tabular" ]; then
tabular_headers="# Repo $SP Age $SP Last active $SP Active on $SP Commits $SP Uncommitted $SP Branch" tabular_headers="# Repo $SP Age $SP Last active $SP Active on $SP Commits $SP Uncommitted $SP Branch"
echo -e "$tabular_headers\n$project $SP $(repository_age) $SP $(last_active) $SP $(active_days "$commit") days $SP $(commit_count "$commit") $SP $(uncommitted_changes_count) $SP $(current_branch_name)" | column -t -s "$COLUMN_CMD_DELIMTER" echo -e "$tabular_headers\n$project $SP $(repository_age) $SP $(last_active) $SP $(active_days $commit) days $SP $(commit_count $commit) $SP $(uncommitted_changes_count) $SP $(current_branch_name)" | column -t -s "$COLUMN_CMD_DELIMTER"
elif [ "$OUTPUT_STYLE" = "oneline" ]; then elif [ "$OUTPUT_STYLE" == "oneline" ]; then
echo "$project / age: $(repository_age) / last active: $(last_active) / active on $(active_days "$commit") days / commits: $(commit_count "$commit") / uncommitted: $(uncommitted_changes_count) / branch: $(current_branch_name)" echo "$project / age: $(repository_age) / last active: $(last_active) / active on $(active_days $commit) days / commits: $(commit_count $commit) / uncommitted: $(uncommitted_changes_count) / branch: $(current_branch_name)"
else else
echo echo
echo " project : $project" echo " project : $project"
echo " repo age : $(repository_age)" echo " repo age : $(repository_age)"
echo " branch: : $(current_branch_name)" echo " branch: : $(current_branch_name)"
echo " last active : $(last_active)" echo " last active : $(last_active)"
echo " active on : $(active_days "$commit") days" # shellcheck disable=SC2086
echo " commits : $(commit_count "$commit")" echo " active on : $(active_days $commit) days"
# shellcheck disable=SC2086
echo " commits : $(commit_count $commit)"
# The file count doesn't support passing a git ref so ignore it if a ref is given # The file count doesn't support passing a git ref so ignore it if a ref is given
if [ "$commit" = "HEAD" ]; then if [ "$commit" == "HEAD" ]; then
echo " files : $(file_count)" echo " files : $(file_count)"
fi fi
echo " uncommitted : $(uncommitted_changes_count)" echo " uncommitted : $(uncommitted_changes_count)"
@ -244,10 +239,10 @@ print_summary() {
if [ -n "$DEDUP_BY_EMAIL" ]; then if [ -n "$DEDUP_BY_EMAIL" ]; then
# the $commit can be empty # the $commit can be empty
# shellcheck disable=SC2086 # shellcheck disable=SC2086
git shortlog $MERGES_ARG -n -s -e "$commit" | dedup_by_email | format_authors git shortlog $MERGES_ARG -n -s -e $commit | dedup_by_email | format_authors
else else
# shellcheck disable=SC2086 # shellcheck disable=SC2086
git shortlog $MERGES_ARG -n -s "$commit" | format_authors git shortlog $MERGES_ARG -n -s $commit | format_authors
fi fi
fi fi
} }

View file

@ -1,14 +0,0 @@
#!/usr/bin/env bash
# Based on scripts from git-utils:
# * https://github.com/ddollar/git-utils/blob/master/git-unwip
# Check if the last commit is a 'WIP' commit
LAST_COMMIT=`git log -1 --pretty=%B | tr -d '[:space:]'`
if [ 'WIP' != $LAST_COMMIT ]; then
echo 'Last commit is not a WIP commit, so it will not be unWIP-ed.'
exit 1
fi
git undo --soft

View file

@ -2,130 +2,42 @@
# #
# Change files modification time to their last commit date # Change files modification time to their last commit date
# #
if [ "$1" = "--touch" ]; then
# Bash unofficial strict mode # Internal use option only just to parallelize things.
set -euo pipefail newer_flag=""
IFS=$'\n\t' [ "$2" = "--newer" ] && newer_flag="true"
shift 2
if [[ "${1:-}" == "--newer" ]]; then bsd=$(date -j > /dev/null 2>&1 && echo 'true')
op=le if [ -n "$bsd" ]; then
shift stat_flags="-f %m"
date_flags="-r"
else
stat_flags="-c %Y"
date_flags="-d@"
fi
for f; do
git_s=$(git --no-pager log --no-renames --pretty=format:%ct -1 @ -- "$f" 2>/dev/null)
mod_s=$(stat $stat_flags "$f" 2>/dev/null)
if [ -n "$git_s" ] && [ -n "$mod_s" ] && [ "$mod_s" -ne "$git_s" ]; then
if [ "$mod_s" -gt "$git_s" ] || [ -z "$newer_flag" ]; then
t=$(date $date_flags$git_s '+%Y%m%d%H%M.%S')
echo "+ touch -h -t $t $f" >&2
touch -h -t "$t" "$f"
fi
fi
done
else else
op=eq opt_r=$(xargs -r false < /dev/null > /dev/null 2>&1 && echo '-r')
# `-n` should be limited or parallelization will not give effect,
# because all args will go into single worker.
NPROC=$(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || getconf _NPROCESSORS_ONLN 2>/dev/null)
# don't touch files that have been modified in the worktree or index
# bsd doesn't have `-z` option for `comm` and `cut`, so use `tr` as work around
prefix="$(git rev-parse --show-prefix) "
comm -23 <(git ls-tree -z -r --name-only --full-name @ | tr '\0' '\n' | sort) \
<(git status -z --porcelain | tr '\0' '\n' | cut -c 4- | sort) \
| cut -c ${#prefix}- \
| tr '\n' '\0' \
| xargs -0 -P"${NPROC:-1}" -n 24 $opt_r git utimes --touch "$1"
fi fi
# BSD systems
if date -j &>/dev/null; then
stat_flags="-f %m"
date_flags="-r"
else
# Non-BSD systems
stat_flags="-c %Y"
date_flags="-d@"
fi
bash_opts=()
if bash --help 2>&1 | grep -q -- '--noprofile'; then
bash_opts+=(--noprofile)
fi
if bash --help 2>&1 | grep -q -- '--norc'; then
bash_opts+=(--norc)
fi
status_opts=(--porcelain --short)
# %ct: committer date, UNIX timestamp / %at: author date, UNIX timestamp
log_opts=(--format='%ct')
if git status --help 2>&1 | grep -q -- "--no-renames"; then
status_opts+=(--no-renames)
log_opts+=(--no-renames)
fi
if git status --help 2>&1 | grep -q -- "--untracked-files"; then
status_opts+=(--untracked-files=no)
fi
if git status --help 2>&1 | grep -q -- "--ignored"; then
status_opts+=(--ignored=no)
fi
prefix="$(git rev-parse --show-prefix) "
strip="${#prefix}"
tmpfile=$(mktemp)
# shellcheck disable=SC2064
trap "rm -f '${tmpfile}'" 0
awk_flags=(
-F'\t'
-v date_flags="${date_flags}"
-v op="${op}"
-v stat_flags="${stat_flags}"
-v strip="${strip}"
-v tmpfile="${tmpfile}"
)
# sanity check, not required:
if awk --help 2>&1 | grep -q -- '--posix'; then
awk_flags+=(--posix)
fi
read -r -d '' awk_script <<"EOF" || true
BEGIN {
seen[""]=1
print "#!/usr/bin/env bash"
print "set +e"
print "t() {"
print " test -e \"$2\" || return 0"
printf(" test \"$(stat %s \"$2\" 2>/dev/null)\" -%s \"$1\" && return 0\n", stat_flags, op)
if (date_flags == "-d@") {
print " echo \"+ touch -h -d@$1 $2\""
print " touch -h -d@$1 \"$2\""
} else {
print " t=$(date -r$1 \"+%Y%m%d%H%M.%S\")"
print " echo \"+ touch -h -t $t $2\""
print " touch -h -t $t \"$2\""
}
print "}"
}
FILENAME==tmpfile {
skip[$1]=1
next
}
# skip blank lines
!/^$/ {
# skip deletes
if (substr($1, length($1), 1) ~ /D/) {
next
}
if (NF == 1) {
ct=$1
next
}
$2 = substr($2, strip, length($2)- strip + 1)
if ($2 in seen) {
next
}
if ($2 in skip) {
next
}
seen[$2]=1
# remove enclosing double quotes that git adds:
if (substr($2, 1, 1) == "\"" && substr($2, length($2), 1) == "\"") {
$2 = substr($2, 2, length($2) - 2)
# unescape remaining double quotes
gsub(/\\"/, "\"", $2)
# unescape escaped backslashes
gsub(/\\\\/, "\\", $2)
}
# escape apostrophes: ' => '\''
gsub(/'/, "'\\''", $2)
printf("t %s '%s'\n", ct, $2)
}
EOF
# prefix is stripped:
git --no-pager status "${status_opts[@]}" . \
| cut -c 4- >"${tmpfile}"
# prefix is not stripped:
git --no-pager log --raw --no-merges "${log_opts[@]}" . \
| awk "${awk_flags[@]}" "${awk_script}" "${tmpfile}" - \
| BASH_ENV='' bash "${bash_opts[@]}" -

View file

@ -1,8 +0,0 @@
#!/usr/bin/env bash
# Based on scripts from git-utils:
# * https://github.com/ddollar/git-utils/blob/master/git-wip
# * https://github.com/ddollar/git-utils/blob/master/git-addremove
git add --all
git commit --all --message="WIP"

View file

@ -3,7 +3,7 @@ index e49cd24..4ae28b5 100755
--- a/bin/git-extras --- a/bin/git-extras
+++ b/bin/git-extras +++ b/bin/git-extras
@@ -4,13 +4,12 @@ VERSION="4.3.0" @@ -4,13 +4,12 @@ VERSION="4.3.0"
INSTALL_SCRIPT="https://raw.githubusercontent.com/tj/git-extras/main/install.sh" INSTALL_SCRIPT="https://raw.githubusercontent.com/tj/git-extras/master/install.sh"
update() { update() {
- local bin="$(command -v git-extras)" - local bin="$(command -v git-extras)"

View file

@ -6,7 +6,7 @@ err() {
} }
make_doc() { make_doc() {
echo "touch man/git-$1.md && make man/git-$1.{1,html}" echo "'touch man/git-$1.md && make man/git-$1.{1,html}'"
} }
check_bash_script() { check_bash_script() {
@ -25,7 +25,7 @@ check_bash_script() {
check_git_extras_cmd_list() { check_git_extras_cmd_list() {
local whitelist=('extras') local whitelist=('extras')
for cmd in "${whitelist[@]}"; do for cmd in ${whitelist[*]}; do
test "$1" == "$cmd" && return test "$1" == "$cmd" && return
done done
@ -47,11 +47,6 @@ check_documentation() {
err "Create man/$cmd.1 and man/$cmd.html via $(make_doc "$1")" err "Create man/$cmd.1 and man/$cmd.html via $(make_doc "$1")"
fi fi
if [ "man/$cmd.md" -nt "man/$cmd.1" ] || [ "man/$cmd.md" -nt "man/$cmd.html" ]
then
err "man/$cmd.md, man/$cmd.1, and man/$cmd.html all exist, but man/$cmd.md is newer. You should rm man/$cmd.{1,html} && $(make_doc "$1")"
fi
check_git_extras_cmd_list "$@" check_git_extras_cmd_list "$@"
check_man_page_index "$@" check_man_page_index "$@"
} }
@ -59,7 +54,7 @@ check_documentation() {
check_Commands_page() { check_Commands_page() {
# These are special cases. All listed together, so we ignore them # These are special cases. All listed together, so we ignore them
local whitelist=('bug' 'chore' 'feature' 'refactor') local whitelist=('bug' 'chore' 'feature' 'refactor')
for cmd in "${whitelist[@]}"; do for cmd in ${whitelist[*]}; do
test "$1" == "$cmd" && return test "$1" == "$cmd" && return
done done
@ -82,9 +77,12 @@ check() {
check_completion "$1" check_completion "$1"
} }
test $# == 0 && set -- $(find bin | cut -b 5- | xargs) usage() {
echo >&2 "Usage: ./check_integrity.sh <command-name> [<command-name2> ...]"
exit 0
}
./bin/git-utimes --newer test $# == 0 && usage
for name in "$@"; do for name in "$@"; do
name=${name#git-} name=${name#git-}

View file

@ -1,29 +1,5 @@
# shellcheck shell=bash
# bash completion support for git-extras. # bash completion support for git-extras.
__gitex_heads_unique() {
local branch specified=("${COMP_WORDS[@]:2}")
for branch in $(__git_heads); do
[[ " ${specified[*]} " == *" $branch "* ]] || printf '%s\n' "$branch"
done
}
_git_authors(){
__gitcomp "-l --list --no-email"
}
_git_browse(){
__git_complete_remote_or_refspec
}
_git_browse_ci(){
__git_complete_remote_or_refspec
}
_git_brv(){
__gitcomp "-r --reverse"
}
_git_changelog(){ _git_changelog(){
local s_opts=( '-a' '-l' '-t' '-f' '-s' '-n' '-p' '-x' '-h' '?' ) local s_opts=( '-a' '-l' '-t' '-f' '-s' '-n' '-p' '-x' '-h' '?' )
local l_opts=( local l_opts=(
@ -45,29 +21,8 @@ _git_changelog(){
__gitcomp "$merged_opts_str" __gitcomp "$merged_opts_str"
} }
_git_coauthor(){ _git_authors(){
local oldIfs=$IFS __gitcomp "-l --list --no-email"
IFS=$'\n'
local cur="${COMP_WORDS[COMP_CWORD]}"
local selection=
if ((COMP_CWORD == 2)); then
for line in $(git authors --list); do
selection+="${line% *}"$'\n'
done
elif ((COMP_CWORD == 3)); then
local chosen_name="${COMP_WORDS[COMP_CWORD-1]}"
for line in $(git authors --list); do
if [ "$chosen_name" = "${line% *}" ]; then
local email=${line#*<}
email=${email%>*}
selection+="$email"$'\n'
fi
done
fi
compopt +o default
compopt -o filenames
COMPREPLY=($(compgen -W "$selection" -- "$cur"))
IFS=$oldIfs
} }
_git_contrib(){ _git_contrib(){
@ -82,10 +37,6 @@ _git_contrib(){
COMPREPLY=($(compgen -W "$all" -- "$cur")) COMPREPLY=($(compgen -W "$all" -- "$cur"))
} }
_git_commits_since(){
__gitcomp "-r --ref"
}
_git_count(){ _git_count(){
__gitcomp "--all" __gitcomp "--all"
} }
@ -95,7 +46,7 @@ __git_cp(){
} }
_git_delete_branch(){ _git_delete_branch(){
__gitcomp "$(__gitex_heads_unique)" __gitcomp "$(__git_heads)"
} }
_git_delete_squashed_branches(){ _git_delete_squashed_branches(){
@ -115,7 +66,6 @@ _git_effort(){
case "$cur" in case "$cur" in
--*) --*)
# shellcheck disable=SC2154
__gitcomp " __gitcomp "
--above --above
$__git_log_common_options $__git_log_common_options
@ -131,7 +81,7 @@ _git_extras(){
} }
__git_extras_workflow(){ __git_extras_workflow(){
__gitcomp "$(__git_heads | grep -- "^$1/" | sed s/^"$1"\\///g) finish" __gitcomp "$(__git_heads | grep -- ^$1/ | sed s/^$1\\///g) finish"
} }
_git_feature(){ _git_feature(){
@ -145,20 +95,16 @@ _git_graft(){
_git_ignore(){ _git_ignore(){
case "$cur" in case "$cur" in
--*) --*)
__gitcomp "--global --local --private --edit --remove" __gitcomp "--global --local --private"
return return
;; ;;
-*) -*)
__gitcomp "--global --local --private --edit --remove -g -l -p -e -r" __gitcomp "--global --local --private -g -l -p"
return return
;; ;;
esac esac
} }
_git_info(){
__gitcomp "--color -c --no-config"
}
_git_missing(){ _git_missing(){
# Suggest all known refs # Suggest all known refs
__gitcomp "$(git for-each-ref --format='%(refname:short)')" __gitcomp "$(git for-each-ref --format='%(refname:short)')"
@ -181,29 +127,15 @@ _git_reauthor(){
__gitcomp "${comp}" __gitcomp "${comp}"
} }
__git_extras_rename(){ _git_scp(){
if ((COMP_CWORD == 2 || COMP_CWORD == 3)); then
__gitcomp "$1"
fi
}
_git_rename_branch(){
__git_extras_rename "$(__git_heads)"
}
_git_rename_remote(){
__git_extras_rename "$(__git_remotes)"
}
_git_rename_tag(){
__git_extras_rename "$(__git_tags)"
}
_git_rscp(){
__git_complete_remote_or_refspec __git_complete_remote_or_refspec
} }
_git_scp(){ _git_stamp(){
__gitcomp '--replace -r'
}
_git_rscp(){
__git_complete_remote_or_refspec __git_complete_remote_or_refspec
} }
@ -211,10 +143,18 @@ _git_squash(){
__gitcomp "$(__git_heads)" __gitcomp "$(__git_heads)"
} }
_git_stamp(){
__gitcomp '--replace -r'
}
_git_undo(){ _git_undo(){
__gitcomp "--hard --soft -h -s" __gitcomp "--hard --soft -h -s"
} }
_git_info(){
__gitcomp "--color -c --no-config"
}
_git_browse(){
__git_complete_remote_or_refspec
}
_git_browse_ci(){
__git_complete_remote_or_refspec
}

View file

@ -51,7 +51,7 @@ __gitex_remote_names() {
local expl local expl
declare -a remote_names declare -a remote_names
remote_names=(${(f)"$(_call_program remotes git remote 2>/dev/null)"}) remote_names=(${(f)"$(_call_program remotes git remote 2>/dev/null)"})
__gitex_command_successful || return __git_command_successful || return
_wanted remote-names expl remote-name compadd $* - $remote_names _wanted remote-names expl remote-name compadd $* - $remote_names
} }
@ -59,7 +59,7 @@ __gitex_tag_names() {
local expl local expl
declare -a tag_names declare -a tag_names
tag_names=(${${(f)"$(_call_program tags git for-each-ref --format='"%(refname)"' refs/tags 2>/dev/null)"}#refs/tags/}) tag_names=(${${(f)"$(_call_program tags git for-each-ref --format='"%(refname)"' refs/tags 2>/dev/null)"}#refs/tags/})
__gitex_command_successful || return __git_command_successful || return
_wanted tag-names expl tag-name compadd $* - $tag_names _wanted tag-names expl tag-name compadd $* - $tag_names
} }
@ -68,24 +68,15 @@ __gitex_branch_names() {
local expl local expl
declare -a branch_names declare -a branch_names
branch_names=(${${(f)"$(_call_program branchrefs git for-each-ref --format='"%(refname)"' refs/heads 2>/dev/null)"}#refs/heads/}) branch_names=(${${(f)"$(_call_program branchrefs git for-each-ref --format='"%(refname)"' refs/heads 2>/dev/null)"}#refs/heads/})
__gitex_command_successful || return __git_command_successful || return
_wanted branch-names expl branch-name compadd $* - $branch_names _wanted branch-names expl branch-name compadd $* - $branch_names
} }
__gitex_branch_names_unique() {
local expl
declare -a branch_names already_specified
branch_names=(${${(f)"$(_call_program branchrefs git for-each-ref --format='"%(refname)"' refs/heads 2>/dev/null)"}#refs/heads/})
__gitex_command_successful || return
already_specified=(${words[2,-1]})
_wanted branch-names expl branch-name compadd -F already_specified $* - $branch_names
}
__gitex_specific_branch_names() { __gitex_specific_branch_names() {
local expl local expl
declare -a branch_names declare -a branch_names
branch_names=(${${(f)"$(_call_program branchrefs git for-each-ref --format='"%(refname)"' refs/heads/"$1" 2>/dev/null)"}#refs/heads/$1/}) branch_names=(${${(f)"$(_call_program branchrefs git for-each-ref --format='"%(refname)"' refs/heads/"$1" 2>/dev/null)"}#refs/heads/$1/})
__gitex_command_successful || return __git_command_successful || return
_wanted branch-names expl branch-name compadd - $branch_names _wanted branch-names expl branch-name compadd - $branch_names
} }
@ -97,31 +88,16 @@ __gitex_submodule_names() {
local expl local expl
declare -a submodule_names declare -a submodule_names
submodule_names=(${(f)"$(_call_program branchrefs git submodule status | awk '{print $2}')"}) # ' submodule_names=(${(f)"$(_call_program branchrefs git submodule status | awk '{print $2}')"}) # '
__gitex_command_successful || return __git_command_successful || return
_wanted submodule-names expl submodule-name compadd $* - $submodule_names _wanted submodule-names expl submodule-name compadd $* - $submodule_names
} }
__gitex_workspace_names() {
local expl
declare -a workspace_names
workspace_names=($(git bulk --listall | awk '{print $1}' | cut -d "." -f 2))
__gitex_command_successful || return
_wanted workspace-names expl workspace-names compadd $* - $workspace_names
}
__gitex_author_names() { __gitex_author_names() {
local expl local expl
declare -a author_names declare -a author_names
author_names=(${(f)"$(_call_program branchrefs git log --format='%aN' | sort -u)"}) author_names=(${(f)"$(_call_program branchrefs git log --format='%aN' | sort -u)"})
__gitex_command_successful || return __git_command_successful || return
_wanted author-names expl author-name compadd $* - $author_names
}
__gitex_author_emails() {
local expl
declare -a author_names
author_names=(${(f)"$(_call_program branchrefs git log --format='%aE' | sort -u)"})
__gitex_command_successful || return
_wanted author-names expl author-name compadd $* - $author_names _wanted author-names expl author-name compadd $* - $author_names
} }
@ -133,27 +109,6 @@ _git-authors() {
'--no-email[without email]' \ '--no-email[without email]' \
} }
_git-brv() {
_arguments \
'(-r --reverse)'{-r,--reverse}'[reverse order]'
}
_git-bulk() {
_arguments \
'-a[Run a git command on all workspaces and their repositories.]' \
'-g[Ask the user for confirmation on every execution (guarded mode).]' \
'-w[Run the git command on the specified workspace.]:workspace-name:__gitex_workspace_names' \
'-q[Suppress bulk output about current execution (quiet mode).]' \
'--no-follow-symlinks[Do not traverse symbolic links when searching for git repositories.]' \
'--no-follow-hidden[Do not traverse hidden directories when searching for git repositories.]' \
'--addworkspace[Register a workspace for bulk operations.]' \
'--removeworkspace[Remove the specified workspace.]:workspace-name:__gitex_workspace_names' \
'--addcurrent[Adds the current directory as workspace to git bulk operations]' \
'--purge[Removes all defined repository locations.]' \
'--listall[List all registered repositories.]' \
'--help[Show the help.]'
}
_git-changelog() { _git-changelog() {
_arguments \ _arguments \
'(-l --list)'{-l,--list}'[list commits]' \ '(-l --list)'{-l,--list}'[list commits]' \
@ -167,13 +122,8 @@ _git-clear() {
_git-coauthor() { _git-coauthor() {
_arguments \ _arguments \
':co-author[co-author to add]:__gitex_author_names' \ ':co-author[co-author to add]' \
':co-author-email[email address of co-author to add]:__gitex_author_emails' ':co-author-email[email address of co-author to add]'
}
_git-commits-since() {
_arguments \
'(-r --ref)'{-r,--ref}'[show commits since ref]'
} }
_git-contrib() { _git-contrib() {
@ -210,12 +160,8 @@ _git-create-branch() {
} }
_git-delete-branch() { _git-delete-branch() {
__gitex_branch_names_unique
}
_git-delete-gone-branches() {
_arguments \ _arguments \
'(-n --dry-run)'{-n,--dry-run}'[show branches that would be deleted without deleting]' ':branch-name:__gitex_branch_names'
} }
_git-delete-squashed-branches() { _git-delete-squashed-branches() {
@ -317,12 +263,9 @@ _git-guilt() {
_git-ignore() { _git-ignore() {
_arguments -C \ _arguments -C \
'(--local -l)'{--local,-l}'[set context to local gitignore]' \ '(--local -l)'{--local,-l}'[show local gitignore]' \
'(--global -g)'{--global,-g}'[set context to global gitignore]' \ '(--global -g)'{--global,-g}'[show global gitignore]' \
'(--private -p)'{--private,-p}'[set context to private gitignore]' \ '(--private -p)'{--private,-p}'[show repo gitignore]'
'(--edit -e)'{--edit,-e}'[set action to edit]' \
'(--remove -r)'{--remove,-r}'[set action to remove]' \
'*:filename:_files'
} }
@ -359,14 +302,6 @@ _git-release() {
'--[The arguments listed after "--" separator will be passed to pre/post-release hook.]' '--[The arguments listed after "--" separator will be passed to pre/post-release hook.]'
} }
_git-rename-file() {
_arguments -C \
'-h[show usage information]' \
'--help[show usage information]' \
'1:source:__git_files' \
'2:destination:__git_files'
}
_git-squash() { _git-squash() {
_arguments '--squash-msg[commit with the squashed commit messages]' _arguments '--squash-msg[commit with the squashed commit messages]'
_arguments \ _arguments \
@ -392,7 +327,6 @@ _git-standup() {
} }
_git-summary() { _git-summary() {
_arguments '--full-path[show repository full path]'
_arguments '--line[summarize with lines rather than commits]' _arguments '--line[summarize with lines rather than commits]'
_arguments '--dedup-by-email[remove duplicate users by the email address]' _arguments '--dedup-by-email[remove duplicate users by the email address]'
_arguments '--no-merges[exclude merge commits]' _arguments '--no-merges[exclude merge commits]'
@ -423,12 +357,10 @@ zstyle ':completion:*:*:git:*' user-commands $existing_user_commands \
clear:'rigorously clean up a repository' \ clear:'rigorously clean up a repository' \
coauthor:'add a co-author to the last commit' \ coauthor:'add a co-author to the last commit' \
commits-since:'show commit logs since some date' \ commits-since:'show commit logs since some date' \
continue:'continue current revert, merge, rebase, or cherry-pick process' \
contrib:'show user contributions' \ contrib:'show user contributions' \
count:'show commit count' \ count:'show commit count' \
create-branch:'create branches' \ create-branch:'create branches' \
delete-branch:'delete branches' \ delete-branch:'delete branches' \
delete-gone-branches:'delete branches whose remote is gone' \
delete-merged-branches:'delete merged branches' \ delete-merged-branches:'delete merged branches' \
delete-squashed-branches:'delete squashed branches' \ delete-squashed-branches:'delete squashed branches' \
delete-submodule:'delete submodules' \ delete-submodule:'delete submodules' \
@ -438,14 +370,13 @@ zstyle ':completion:*:*:git:*' user-commands $existing_user_commands \
extras:'awesome git utilities' \ extras:'awesome git utilities' \
feature:'create/merge feature branch' \ feature:'create/merge feature branch' \
force-clone:'overwrite local repositories with clone' \ force-clone:'overwrite local repositories with clone' \
fork:'fork a repo on GitHub' \ fork:'fork a repo on github' \
fresh-branch:'create fresh branches' \ fresh-branch:'create fresh branches' \
get:'clone a repository in a directory' \ gh-pages:'create the github pages branch' \
gh-pages:'create the GitHub pages branch' \
graft:'merge and destroy a given branch' \ graft:'merge and destroy a given branch' \
guilt:'calculate change between two revisions' \ guilt:'calculate change between two revisions' \
ignore-io:'get sample gitignore file' \ ignore-io:'get sample gitignore file' \
ignore:'Modify or display .gitignore files' \ ignore:'add .gitignore patterns' \
info:'returns information on current repository' \ info:'returns information on current repository' \
local-commits:'list local commits' \ local-commits:'list local commits' \
lock:'lock a file excluded from version control' \ lock:'lock a file excluded from version control' \
@ -465,7 +396,6 @@ zstyle ':completion:*:*:git:*' user-commands $existing_user_commands \
refactor:'create refactor branch' \ refactor:'create refactor branch' \
release:'commit, tag and push changes to the repository' \ release:'commit, tag and push changes to the repository' \
rename-branch:'rename a branch' \ rename-branch:'rename a branch' \
rename-file:'rename a file or directory and ensure Git recognizes the change, regardless of filesystem case-sensitivity' \
rename-tag:'rename a tag' \ rename-tag:'rename a tag' \
rename-remote:'rename a remote' \ rename-remote:'rename a remote' \
repl:'git read-eval-print-loop' \ repl:'git read-eval-print-loop' \
@ -485,6 +415,4 @@ zstyle ':completion:*:*:git:*' user-commands $existing_user_commands \
touch:'touch and add file to the index' \ touch:'touch and add file to the index' \
undo:'remove latest commits' \ undo:'remove latest commits' \
unlock:'unlock a file excluded from version control' \ unlock:'unlock a file excluded from version control' \
utimes:'change files modification time to their last commit date' \ utimes:'change files modification time to their last commit date'
unwip:'undo a WIP commit' \
wip:'create a WIP commit'

View file

@ -27,12 +27,11 @@ set __fish_git_extras_commands \
"force-clone:overwrite local repositories with clone" \ "force-clone:overwrite local repositories with clone" \
"fork:Fork a repo on github" \ "fork:Fork a repo on github" \
"fresh-branch:Create fresh branches" \ "fresh-branch:Create fresh branches" \
"get:Clone a repository in a directory" \
"gh-pages:Create the GitHub Pages branch" \ "gh-pages:Create the GitHub Pages branch" \
"graft:Merge and destroy a given branch" \ "graft:Merge and destroy a given branch" \
"guilt:calculate change between two revisions" \ "guilt:calculate change between two revisions" \
"ignore-io:Get sample gitignore file" \ "ignore-io:Get sample gitignore file" \
"ignore:Modify or display .gitignore files" \ "ignore:Add .gitignore patterns" \
"info:Returns information on current repository" \ "info:Returns information on current repository" \
"local-commits:List local commits" \ "local-commits:List local commits" \
"lock:Lock a file excluded from version control" \ "lock:Lock a file excluded from version control" \
@ -50,7 +49,6 @@ set __fish_git_extras_commands \
"rebase-patch:Rebases a patch" \ "rebase-patch:Rebases a patch" \
"release:Commit, tag and push changes to the repository" \ "release:Commit, tag and push changes to the repository" \
"rename-branch:rename local branch and push to remote" \ "rename-branch:rename local branch and push to remote" \
"rename-file:rename a file or directory and ensure Git recognizes the change, regardless of filesystem case-sensitivity" \
"rename-remote:Rename a remote" \ "rename-remote:Rename a remote" \
"rename-tag:Rename a tag" \ "rename-tag:Rename a tag" \
"repl:git read-eval-print-loop" \ "repl:git read-eval-print-loop" \
@ -72,22 +70,20 @@ set __fish_git_extras_commands \
"unlock:Unlock a file excluded from version control" "unlock:Unlock a file excluded from version control"
# completion for git-extras itself # completion for git-extras itself
complete -c git -f -n __fish_git_needs_command -a extras -d 'GIT utilities: repo summary, repl, changelog population, and more' complete -c git -f -n '__fish_git_needs_command' -a 'extras' -d 'GIT utilities: repo summary, repl, changelog population, and more'
complete -c git -f -n '__fish_git_using_command extras' -s h -l help -d 'Show the help message, can be used for any git-extras commands' complete -c git -f -n '__fish_git_using_command extras' -s h -l help -d 'Show the help message, can be used for any git-extras commands'
complete -c git -f -n '__fish_git_using_command extras' -s v -l version -d 'Show git-extras version number' complete -c git -f -n '__fish_git_using_command extras' -s v -l version -d 'Show git-extras version number'
complete -c git -f -n '__fish_git_using_command extras; and not contains -- update (commandline -opc)' -a update -d 'Self update' complete -c git -f -n '__fish_git_using_command extras; and not contains -- update (commandline -opc)' -a "update" -d 'Self update'
# completion for git-extras provided commands # completion for git-extras provided commands
set __fish_git_extras_commands (printf -- '%s\n' $__fish_git_extras_commands | sed 's/:/\textras:/' | string collect | string escape) set __fish_git_extras_commands (printf -- '%s\n' $__fish_git_extras_commands | sed 's/:/\textras:/' | string collect | string escape)
complete -c git -n __fish_git_needs_command -a "$__fish_git_extras_commands" complete -c git -n '__fish_git_needs_command' -a "$__fish_git_extras_commands"
# authors # authors
complete -c git -f -n '__fish_git_using_command authors' -s l -l list -d 'show authors' complete -c git -f -n '__fish_git_using_command authors' -s l -l list -d 'show authors'
complete -c git -f -n '__fish_git_using_command authors' -l no-email -d 'without email' complete -c git -f -n '__fish_git_using_command authors' -l no-email -d 'without email'
# brv
complete -c git -f -n '__fish_git_using_command brv' -s r -l reverse -d 'reverse the sort order'
# bulk # bulk
complete -c git -n '__fish_git_using_command bulk' -s a -d 'Run a git command on all workspaces and their repositories' complete -c git -n '__fish_git_using_command bulk' -s a -d 'Run a git command on all workspaces and their repositories'
complete -c git -n '__fish_git_using_command bulk' -s g -d 'Ask the user for confirmation on every execution' complete -c git -n '__fish_git_using_command bulk' -s g -d 'Ask the user for confirmation on every execution'
complete -c git -x -n '__fish_git_using_command bulk' -s w -d 'Run on specified workspace' complete -c git -x -n '__fish_git_using_command bulk' -s w -d 'Run on specified workspace'
complete -c git -x -n '__fish_git_using_command bulk' -l addworkspace -d 'Register a workspace for builk operations' complete -c git -x -n '__fish_git_using_command bulk' -l addworkspace -d 'Register a workspace for builk operations'
complete -c git -x -n '__fish_git_using_command bulk; and contains addworkspace (commandline -opc)' -l addworkspace -d 'the URL or file with URLs to be added' complete -c git -x -n '__fish_git_using_command bulk; and contains addworkspace (commandline -opc)' -l addworkspace -d 'the URL or file with URLs to be added'
@ -106,33 +102,6 @@ complete -c git -f -n '__fish_git_using_command changelog' -s n -l no-merges -d
complete -c git -f -n '__fish_git_using_command changelog' -s m -l merges-only -d 'Uses only merge commits (commits with more than 1 parent) for generated changelog' complete -c git -f -n '__fish_git_using_command changelog' -s m -l merges-only -d 'Uses only merge commits (commits with more than 1 parent) for generated changelog'
complete -c git -f -n '__fish_git_using_command changelog' -s p -l prune-old -d 'Replace existing changelog entirely with newly generated content' complete -c git -f -n '__fish_git_using_command changelog' -s p -l prune-old -d 'Replace existing changelog entirely with newly generated content'
complete -c git -f -n '__fish_git_using_command changelog' -s x -l stdout -d 'Write output to stdout instead of to a new changelog file' complete -c git -f -n '__fish_git_using_command changelog' -s x -l stdout -d 'Write output to stdout instead of to a new changelog file'
# coauthor
function __fish_git_arg_number -a number
set -l cmd (commandline -opc)
test (count $cmd) -eq $number
end
function __fish_git_extra_coauthor_name
for line in (git authors --list)
printf '%s\n' $line | string replace --regex ' <.*' ''
end
end
function __fish_git_extra_coauthor_email
set -l cmd (commandline -opc)
# name provided in the previous positional argument
set -l name $cmd[3]
for line in (git authors --list)
set -l loop_name (printf '%s\n' $line | string replace --regex ' <.*' '')
if test "$name" = "$loop_name"
printf '%s\n' $line | string replace --regex '.*?<' '' | string replace --regex '>.*?' ''
end
end
end
complete -c git -f -n '__fish_git_using_command coauthor; and __fish_git_arg_number 2' -a '(__fish_git_extra_coauthor_name)'
complete -c git -f -n '__fish_git_using_command coauthor; and __fish_git_arg_number 3' -a '(__fish_git_extra_coauthor_email)'
# commits-since
complete -c git -f -n '__fish_git_using_command commits-since' -s r -l ref -d 'show commits since ref'
# count # count
complete -c git -f -n '__fish_git_using_command count' -l all -d 'detailed commit count' complete -c git -f -n '__fish_git_using_command count' -l all -d 'detailed commit count'
# create-branch # create-branch
@ -149,24 +118,22 @@ complete -c git -x -n "__fish_git_using_command delete-tag" -a '(__fish_git for-
complete -c git -f -n '__fish_git_using_command effort' -l above -d 'ignore file with less than x commits' complete -c git -f -n '__fish_git_using_command effort' -l above -d 'ignore file with less than x commits'
# feature # feature
complete -c git -x -n '__fish_git_using_command feature' -s a -l alias -d 'use branch_prefix instead of feature' complete -c git -x -n '__fish_git_using_command feature' -s a -l alias -d 'use branch_prefix instead of feature'
complete -c git -f -n '__fish_git_using_command feature; and not contains -- finish (commandline -opc)' -a finish -d 'merge and delete the feature branch' complete -c git -f -n '__fish_git_using_command feature; and not contains -- finish (commandline -opc)' -a "finish" -d 'merge and delete the feature branch'
complete -c git -f -n '__fish_git_using_command feature; and contains -- finish (commandline -opc)' -l squash -d 'Run a squash merge' complete -c git -f -n '__fish_git_using_command feature; and contains -- finish (commandline -opc)' -l squash -d 'Run a squash merge'
complete -c git -x -n '__fish_git_using_command feature; and contains -- finish (commandline -opc)' -a '(__fish_git for-each-ref --format="%(refname)" 2>/dev/null | grep "refs/heads/feature")' -d 'name of feature branch' complete -c git -x -n '__fish_git_using_command feature; and contains -- finish (commandline -opc)' -a '(__fish_git for-each-ref --format="%(refname)" 2>/dev/null | grep "refs/heads/feature")' -d 'name of feature branch'
complete -c git -x -n '__fish_git_using_command feature; and not contains -- finish (commandline -opc)' -s r -l remote -a '(__fish_git_unique_remote_branches)' -d 'Setup a remote tracking branch' complete -c git -x -n '__fish_git_using_command feature; and not contains -- finish (commandline -opc)' -s r -l remote -a '(__fish_git_unique_remote_branches)' -d 'Setup a remote tracking branch'
# graft # graft
complete -c git -x -n '__fish_git_using_command graft' -s r -l remote -a '(__fish_git_branches)' -d src-branch-name complete -c git -x -n '__fish_git_using_command graft' -s r -l remote -a '(__fish_git_branches)' -d 'src-branch-name'
complete -c git -x -n '__fish_git_using_command graft' -s r -l remote -a '(__fish_git_branches)' -d dest-branch-name complete -c git -x -n '__fish_git_using_command graft' -s r -l remote -a '(__fish_git_branches)' -d 'dest-branch-name'
# guilt # guilt
complete -c git -f -n '__fish_git_using_command guilt' -s w -l ignore-whitespace -d 'ignore whitespace only changes' complete -c git -f -n '__fish_git_using_command guilt' -s w -l ignore-whitespace -d 'ignore whitespace only changes'
complete -c git -f -n '__fish_git_using_command guilt' -s e -l email -d 'display author emails instead of names' complete -c git -f -n '__fish_git_using_command guilt' -s e -l email -d 'display author emails instead of names'
complete -c git -f -n '__fish_git_using_command guilt' -s d -l debug -d 'output debug information' complete -c git -f -n '__fish_git_using_command guilt' -s d -l debug -d 'output debug information'
complete -c git -f -n '__fish_git_using_command guilt' -s h -d 'output usage information' complete -c git -f -n '__fish_git_using_command guilt' -s h -d 'output usage information'
# ignore # ignore
complete -c git -f -n '__fish_git_using_command ignore' -s l -l local -d 'set context to local gitignore' complete -c git -f -n '__fish_git_using_command ignore' -s l -l local -d 'show local gitignore'
complete -c git -f -n '__fish_git_using_command ignore' -s g -l global -d 'set context to global gitignore' complete -c git -f -n '__fish_git_using_command ignore' -s g -l global -d 'show global gitignore'
complete -c git -f -n '__fish_git_using_command ignore' -s p -l private -d 'set context to private gitignore' complete -c git -f -n '__fish_git_using_command ignore' -s p -l private -d 'show repo gitignore'
complete -c git -f -n '__fish_git_using_command ignore' -s e -l edit -d 'set action to edit'
complete -c git -f -n '__fish_git_using_command ignore' -s r -l remove -d 'set action to remove'
# ignore-io # ignore-io
function __fish_git_extra_get_ignore_io_types function __fish_git_extra_get_ignore_io_types
# we will first remove every tab spaces, and then append `\t` at the end to remove the default description # we will first remove every tab spaces, and then append `\t` at the end to remove the default description
@ -181,35 +148,33 @@ complete -c git -x -n '__fish_git_using_command ignore-io' -s s -l search -d 'se
complete -c git -x -n '__fish_git_using_command ignore-io' -s t -l show-update-time -d 'Show the last modified time of ~/.gi_list' complete -c git -x -n '__fish_git_using_command ignore-io' -s t -l show-update-time -d 'Show the last modified time of ~/.gi_list'
complete -c git -x -n '__fish_git_using_command ignore-io' -s u -l update -d 'Update ~/.gi_list' complete -c git -x -n '__fish_git_using_command ignore-io' -s u -l update -d 'Update ~/.gi_list'
# merge-into # merge-into
complete -c git -n '__fish_git_using_command merge-into' -l ff-only -d 'merge only fast-forward' complete -c git -n '__fish_git_using_command merge-into' -l ff-only -d 'merge only fast-forward'
complete -c git -x -n '__fish_git_using_command merge-into' -a '(__fish_git_branches)' complete -c git -x -n '__fish_git_using_command merge-into' -a '(__fish_git_branches)'
# missing # missing
complete -c git -x -n '__fish_git_using_command missing' -a '(__fish_git_branches)' complete -c git -x -n '__fish_git_using_command missing' -a '(__fish_git_branches)'
# rename-file
complete -c git -f -n '__fish_git_using_command rename-file' -s h -l help -d 'Show usage information'
# squash # squash
complete -c git -x -n '__fish_git_using_command squash' -a '(__fish_git_branches)' complete -c git -x -n '__fish_git_using_command squash' -a '(__fish_git_branches)'
complete -c git -x -n '__fish_git_using_command squash' -l squash-msg -d 'commit with the squashed commit messages' complete -c git -x -n '__fish_git_using_command squash' -l squash-msg -d 'commit with the squashed commit messages'
# stamp # stamp
complete -c git -x -n '__fish_git_using_command stamp' -s r -l replace -d 'replace stamps with same id' complete -c git -x -n '__fish_git_using_command stamp' -s r -l replace -d 'replace stamps with same id'
# standup # standup
complete -c git -x -n '__fish_git_using_command standup' -s a -d 'Specify the author of commits. Use all to specify all authors' complete -c git -x -n '__fish_git_using_command standup' -s a -d 'Specify the author of commits. Use "all" to specify all authors'
complete -c git -x -n '__fish_git_using_command standup' -s m -d 'The depth of recursive directory search' complete -c git -x -n '__fish_git_using_command standup' -s m -d 'The depth of recursive directory search'
complete -c git -x -n '__fish_git_using_command standup' -s d -d 'Show history since N days ago' complete -c git -x -n '__fish_git_using_command standup' -s d -d 'Show history since N days ago'
complete -c git -x -n '__fish_git_using_command standup' -s D -d 'Specify the date format displayed in commit history' complete -c git -x -n '__fish_git_using_command standup' -s D -d 'Specify the date format displayed in commit history'
complete -c git -n '__fish_git_using_command standup' -s f -d 'Fetch commits before showing history' complete -c git -n '__fish_git_using_command standup' -s f -d 'Fetch commits before showing history'
complete -c git -n '__fish_git_using_command standup' -s g -d 'Display GPG signed info' complete -c git -n '__fish_git_using_command standup' -s g -d 'Display GPG signed info'
complete -c git -n '__fish_git_using_command standup' -s h -l help -d 'Display help message' complete -c git -n '__fish_git_using_command standup' -s h -l help -d 'Display help message'
complete -c git -n '__fish_git_using_command standup' -s L -d 'Enable the inclusion of symbolic links' complete -c git -n '__fish_git_using_command standup' -s L -d 'Enable the inclusion of symbolic links'
complete -c git -n '__fish_git_using_command standup' -s B -d 'Display the commits in branch group' complete -c git -n '__fish_git_using_command standup' -s B -d 'Display the commits in branch group'
complete -c git -x -n '__fish_git_using_command standup' -s n -d 'Limit the number of commits displayed per group' complete -c git -x -n '__fish_git_using_command standup' -s n -d 'Limit the number of commits displayed per group'
# summary # summary
complete -c git -n '__fish_git_using_command summary' -l line -d 'summarize with lines rather than commits' complete -c git -n '__fish_git_using_command summary' -l line -d 'summarize with lines rather than commits'
complete -c git -n '__fish_git_using_command summary' -l dedup-by-email -d 'remove duplicate users by the email address' complete -c git -n '__fish_git_using_command summary' -l dedup-by-email -d 'remove duplicate users by the email address'
complete -c git -n '__fish_git_using_command summary' -l no-merges -d 'exclude merge commits' complete -c git -n '__fish_git_using_command summary' -l no-merges -d 'exclude merge commits'
# release # release
complete -c git -x -n '__fish_git_using_command release' -s c -d 'Generates/populates the changelog with all commit message since the last tag' complete -c git -x -n '__fish_git_using_command release' -s c -d 'Generates/populates the changelog with all commit message since the last tag'
complete -c git -x -n '__fish_git_using_command release' -s r -d 'The remote repository that is destination of a push operation' complete -c git -x -n '__fish_git_using_command release' -s r -d 'The "remote" repository that is destination of a push operation'
complete -c git -x -n '__fish_git_using_command release' -s m -d 'use the custom commit information instead of the default message' complete -c git -x -n '__fish_git_using_command release' -s m -d 'use the custom commit information instead of the default message'
complete -c git -x -n '__fish_git_using_command release' -s s -d 'Create a signed and annotated tag' complete -c git -x -n '__fish_git_using_command release' -s s -d 'Create a signed and annotated tag'
complete -c git -x -n '__fish_git_using_command release' -s u -d 'Create a tag, annotated and signed with the given key' complete -c git -x -n '__fish_git_using_command release' -s u -d 'Create a tag, annotated and signed with the given key'
@ -218,3 +183,5 @@ complete -c git -x -n '__fish_git_using_command release' -l no-empty-commit -d '
# undo # undo
complete -c git -x -n '__fish_git_using_command undo' -s s -l soft -d 'only rolls back the commit but changes remain un-staged' complete -c git -x -n '__fish_git_using_command undo' -s s -l soft -d 'only rolls back the commit but changes remain un-staged'
complete -c git -x -n '__fish_git_using_command undo' -s h -l hard -d 'wipes your commit(s)' complete -c git -x -n '__fish_git_using_command undo' -s h -l hard -d 'wipes your commit(s)'

View file

@ -3,9 +3,7 @@
# #
is_git_repo() { is_git_repo() {
# --git-dir succeeds for both normal and bare repositories, whereas git rev-parse --show-toplevel > /dev/null 2>&1
# --show-toplevel fails inside a bare repository (it has no working tree).
git rev-parse --git-dir > /dev/null 2>&1
result=$? result=$?
if test $result != 0; then if test $result != 0; then
>&2 echo 'Not a git repo!' >&2 echo 'Not a git repo!'

View file

@ -39,34 +39,13 @@ goto :defaultpath
rem remove the last slash rem remove the last slash
SET bindir=%bindir:~0,-1% SET bindir=%bindir:~0,-1%
for %%G in ("%bindir%") do set installdir=%%~dpG for %%G in ("%bindir%") do set installdir=%%~dpG
rem strip a trailing slash so we can inspect the leaf directory name set PREFIX=%installdir%mingw64
if "%installdir:~-1%"=="\" set installdir=%installdir:~0,-1%
rem git.exe found under <GitRoot>\mingw64\bin or <GitRoot>\clangarm64\bin
rem means installdir already is the architecture directory itself
for %%G in ("%installdir%") do set archdir=%%~nxG
if /I "%archdir%"=="mingw64" (
set PREFIX=%installdir%
) else if /I "%archdir%"=="clangarm64" (
set PREFIX=%installdir%
) else if exist "%installdir%\mingw64" (
set PREFIX=%installdir%\mingw64
) else if exist "%installdir%\clangarm64" (
set PREFIX=%installdir%\clangarm64
) else (
set PREFIX=%installdir%\mingw64
)
goto :foundprefix goto :foundprefix
:defaultpath :defaultpath
:: default for Git for Windows 2.x :: default for Git for Windows 2.x
if exist "%ProgramFiles%\Git" ( if exist "%ProgramFiles%\Git" (
if exist "%ProgramFiles%\Git\mingw64" ( set PREFIX=%ProgramFiles%\Git\mingw64
set PREFIX=%ProgramFiles%\Git\mingw64
) else if exist "%ProgramFiles%\Git\clangarm64" (
set PREFIX=%ProgramFiles%\Git\clangarm64
) else (
set PREFIX=%ProgramFiles%\Git\mingw64
)
) )
:foundprefix :foundprefix
@ -76,11 +55,9 @@ IF NOT "%~1"=="" (
REM just supplying the git dir is enough... REM just supplying the git dir is enough...
if exist "%~1\mingw64" ( if exist "%~1\mingw64" (
set PREFIX=%~1\mingw64 set PREFIX=%~1\mingw64
) else if exist "%~1\clangarm64" (
set PREFIX=%~1\clangarm64
) else ( ) else (
echo Using git install path "%~1" as PREFIX, please make sure it's really a echo Using git install path "%~1" as PREFIX, please make sure it's really a
echo path to the mingw64 or clangarm64 directory... echo path to the mingw64 directory...
echo. echo.
SET PREFIX=%~1 SET PREFIX=%~1
) )
@ -95,14 +72,12 @@ set GIT_INSTALL_DIR=!GIT_INSTALL_DIR:"=!
IF %GIT_INSTALL_DIR:~-1%==\ SET GIT_INSTALL_DIR=%GIT_INSTALL_DIR:~0,-1% IF %GIT_INSTALL_DIR:~-1%==\ SET GIT_INSTALL_DIR=%GIT_INSTALL_DIR:~0,-1%
if not exist "%GIT_INSTALL_DIR%\mingw64" ( if not exist "%GIT_INSTALL_DIR%\mingw64" (
if not exist "%GIT_INSTALL_DIR%\clangarm64" ( echo No mingw64 folder found in %GIT_INSTALL_DIR%.
echo No mingw64 or clangarm64 folder found in %GIT_INSTALL_DIR%. echo.
echo. echo Please supply a proper "Git for Windows 2.x" install path:
echo Please supply a proper "Git for Windows 2.x" install path: echo "install.cmd c:\[git-install-path]"
echo "install.cmd c:\[git-install-path]" set ERROR=1
set ERROR=1 goto :exit
goto :exit
)
) )
echo Installing to %PREFIX% echo Installing to %PREFIX%

View file

@ -1,6 +1,6 @@
.\" generated with Ronn-NG/v0.9.1 .\" generated with Ronn-NG/v0.9.1
.\" http://github.com/apjanke/ronn-ng/tree/0.9.1 .\" http://github.com/apjanke/ronn-ng/tree/0.9.1
.TH "GIT\-ALIAS" "1" "September 2024" "" "Git Extras" .TH "GIT\-ALIAS" "1" "August 2021" "" "Git Extras"
.SH "NAME" .SH "NAME"
\fBgit\-alias\fR \- Define, search and show aliases \fBgit\-alias\fR \- Define, search and show aliases
.SH "SYNOPSIS" .SH "SYNOPSIS"
@ -9,30 +9,9 @@
\fBgit\-alias\fR <search\-pattern> \fBgit\-alias\fR <search\-pattern>
.br .br
\fBgit\-alias\fR <alias\-name> <command> \fBgit\-alias\fR <alias\-name> <command>
.br
\fBgit\-alias\fR [\-\-global]
.br
\fBgit\-alias\fR [\-\-local]
.br
\fBgit\-alias\fR [\-\-global] <search\-pattern>
.br
\fBgit\-alias\fR [\-\-local] <search\-pattern>
.br
\fBgit\-alias\fR [\-\-global] <alias\-name> <command>
.br
\fBgit\-alias\fR [\-\-local] <alias\-name> <command>
.br
.SH "DESCRIPTION" .SH "DESCRIPTION"
List all aliases, show one alias, or set one (global or local) alias\. List all aliases, show one alias, or set one (global) alias\.
.SH "OPTIONS" .SH "OPTIONS"
\-\-global
.P
Show or create alias in the system config
.P
\-\-local
.P
Show or create alias in the repository config
.P
<search\-pattern> <search\-pattern>
.P .P
The pattern used to search aliases\. The pattern used to search aliases\.
@ -67,8 +46,8 @@ $ git alias
s = status s = status
amend = commit \-\-amend amend = commit \-\-amend
rank = shortlog \-sn \-\-no\-merges rank = shortlog \-sn \-\-no\-merges
whatis = show \-s \-\-pretty='tformat:%h (%s, %ad)' \-\-date=short whatis = show \-s \-\-pretty=\'tformat:%h (%s, %ad)\' \-\-date=short
whois = !sh \-c 'git log \-i \-1 \-\-pretty="format:%an <%ae> whois = !sh \-c \'git log \-i \-1 \-\-pretty="format:%an <%ae>
.fi .fi
.IP "" 0 .IP "" 0
.SH "AUTHOR" .SH "AUTHOR"

View file

@ -77,30 +77,16 @@
</p> </p>
<h2 id="SYNOPSIS">SYNOPSIS</h2> <h2 id="SYNOPSIS">SYNOPSIS</h2>
<p><code>git-alias</code> <br> <p><code>git-alias</code><br>
<code>git-alias</code> &lt;search-pattern&gt; <br> <code>git-alias</code> &lt;search-pattern&gt;<br>
<code>git-alias</code> &lt;alias-name&gt; &lt;command&gt; <br> <code>git-alias</code> &lt;alias-name&gt; &lt;command&gt;</p>
<code>git-alias</code> [--global] <br>
<code>git-alias</code> [--local] <br>
<code>git-alias</code> [--global] &lt;search-pattern&gt; <br>
<code>git-alias</code> [--local] &lt;search-pattern&gt; <br>
<code>git-alias</code> [--global] &lt;alias-name&gt; &lt;command&gt; <br>
<code>git-alias</code> [--local] &lt;alias-name&gt; &lt;command&gt; <br></p>
<h2 id="DESCRIPTION">DESCRIPTION</h2> <h2 id="DESCRIPTION">DESCRIPTION</h2>
<p>List all aliases, show one alias, or set one (global or local) alias.</p> <p>List all aliases, show one alias, or set one (global) alias.</p>
<h2 id="OPTIONS">OPTIONS</h2> <h2 id="OPTIONS">OPTIONS</h2>
<p>--global</p>
<p>Show or create alias in the system config</p>
<p>--local</p>
<p>Show or create alias in the repository config</p>
<p>&lt;search-pattern&gt;</p> <p>&lt;search-pattern&gt;</p>
<p>The pattern used to search aliases.</p> <p>The pattern used to search aliases.</p>
@ -150,7 +136,7 @@ whois = !sh -c 'git log -i -1 --pretty="format:%an &lt;%ae&gt;
<ol class='man-decor man-foot man foot'> <ol class='man-decor man-foot man foot'>
<li class='tl'></li> <li class='tl'></li>
<li class='tc'>September 2024</li> <li class='tc'>August 2021</li>
<li class='tr'>git-alias(1)</li> <li class='tr'>git-alias(1)</li>
</ol> </ol>

View file

@ -3,30 +3,16 @@ git-alias(1) -- Define, search and show aliases
## SYNOPSIS ## SYNOPSIS
`git-alias` <br> `git-alias`
`git-alias` &lt;search-pattern&gt; <br> `git-alias` &lt;search-pattern&gt;
`git-alias` &lt;alias-name&gt; &lt;command&gt; <br> `git-alias` &lt;alias-name&gt; &lt;command&gt;
`git-alias` [--global] <br>
`git-alias` [--local] <br>
`git-alias` [--global] &lt;search-pattern&gt; <br>
`git-alias` [--local] &lt;search-pattern&gt; <br>
`git-alias` [--global] &lt;alias-name&gt; &lt;command&gt; <br>
`git-alias` [--local] &lt;alias-name&gt; &lt;command&gt; <br>
## DESCRIPTION ## DESCRIPTION
List all aliases, show one alias, or set one (global or local) alias. List all aliases, show one alias, or set one (global) alias.
## OPTIONS ## OPTIONS
--global
Show or create alias in the system config
--local
Show or create alias in the repository config
&lt;search-pattern&gt; &lt;search-pattern&gt;
The pattern used to search aliases. The pattern used to search aliases.

View file

@ -1,6 +1,6 @@
.\" generated with Ronn-NG/v0.10.1 .\" generated with Ronn-NG/v0.9.1
.\" http://github.com/apjanke/ronn-ng/tree/0.10.1 .\" http://github.com/apjanke/ronn-ng/tree/0.9.1
.TH "GIT\-ARCHIVE\-FILE" "1" "March 2026" "" "Git Extras" .TH "GIT\-ARCHIVE\-FILE" "1" "May 2020" "" "Git Extras"
.SH "NAME" .SH "NAME"
\fBgit\-archive\-file\fR \- Export the current HEAD of the git repository to an archive \fBgit\-archive\-file\fR \- Export the current HEAD of the git repository to an archive
.SH "SYNOPSIS" .SH "SYNOPSIS"
@ -14,11 +14,11 @@ Archive naming conventions:
.P .P
On any branch: \fBgit\-extras\.1\.7\.0\-110\-gafefba7\.branch\-name\.zip\fR On any branch: \fBgit\-extras\.1\.7\.0\-110\-gafefba7\.branch\-name\.zip\fR
.P .P
On the default branch: \fBgit\-extras\.1\.7\.0\-110\-gafefba7\.zip\fR On master branch: \fBgit\-extras\.1\.7\.0\-110\-gafefba7\.zip\fR
.P .P
On a detached HEAD (e\.g\. a tag): \fBgit\-extras\.1\.7\.0\.zip\fR On a detached HEAD (e\.g\. a tag): \fBgit\-extras\.1\.7\.0\.zip\fR
.P .P
The '/' and '\e' in the branch name will be converted into '\-'\. The \'/\' and \'\e\' in the branch name will be converted into \'\-\'\.
.SH "AUTHOR" .SH "AUTHOR"
Written by Philipp Klose <\fIme@thehippo\.de\fR> Written by Philipp Klose <\fIme@thehippo\.de\fR>
.SH "REPORTING BUGS" .SH "REPORTING BUGS"

View file

@ -1,8 +1,8 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<meta http-equiv='content-type' content='text/html;charset=utf-8'> <meta http-equiv='content-type' content='text/html;charset=utf8'>
<meta name='generator' content='Ronn-NG/v0.10.1 (http://github.com/apjanke/ronn-ng/tree/0.10.1)'> <meta name='generator' content='Ronn-NG/v0.9.1 (http://github.com/apjanke/ronn-ng/tree/0.9.1)'>
<title>git-archive-file(1) - Export the current HEAD of the git repository to an archive</title> <title>git-archive-file(1) - Export the current HEAD of the git repository to an archive</title>
<style type='text/css' media='all'> <style type='text/css' media='all'>
/* style: man */ /* style: man */
@ -93,7 +93,7 @@
<p>On any branch: <code>git-extras.1.7.0-110-gafefba7.branch-name.zip</code></p> <p>On any branch: <code>git-extras.1.7.0-110-gafefba7.branch-name.zip</code></p>
<p>On the default branch: <code>git-extras.1.7.0-110-gafefba7.zip</code></p> <p>On master branch: <code>git-extras.1.7.0-110-gafefba7.zip</code></p>
<p>On a detached HEAD (e.g. a tag): <code>git-extras.1.7.0.zip</code></p> <p>On a detached HEAD (e.g. a tag): <code>git-extras.1.7.0.zip</code></p>
@ -113,7 +113,7 @@
<ol class='man-decor man-foot man foot'> <ol class='man-decor man-foot man foot'>
<li class='tl'></li> <li class='tl'></li>
<li class='tc'>March 2026</li> <li class='tc'>May 2020</li>
<li class='tr'>git-archive-file(1)</li> <li class='tr'>git-archive-file(1)</li>
</ol> </ol>

View file

@ -20,7 +20,7 @@ Archive naming conventions:
On any branch: `git-extras.1.7.0-110-gafefba7.branch-name.zip` On any branch: `git-extras.1.7.0-110-gafefba7.branch-name.zip`
On the default branch: `git-extras.1.7.0-110-gafefba7.zip` On master branch: `git-extras.1.7.0-110-gafefba7.zip`
On a detached HEAD (e.g. a tag): `git-extras.1.7.0.zip` On a detached HEAD (e.g. a tag): `git-extras.1.7.0.zip`

View file

@ -1,59 +1,87 @@
.\" generated with Ronn-NG/v0.9.1 .\" generated with Ronn/v0.7.3
.\" http://github.com/apjanke/ronn-ng/tree/0.9.1 .\" http://github.com/rtomayko/ronn/tree/0.7.3
.TH "GIT\-AUTHORS" "1" "November 2023" "" "Git Extras" .
.TH "GIT\-AUTHORS" "1" "October 2017" "" "Git Extras"
.
.SH "NAME" .SH "NAME"
\fBgit\-authors\fR \- Generate authors report \fBgit\-authors\fR \- Generate authors report
.
.SH "SYNOPSIS" .SH "SYNOPSIS"
\fBgit\-authors\fR [\-l, \-\-list] [\-\-no\-email] \fBgit\-authors\fR [\-l, \-\-list] [\-\-no\-email]
.
.SH "DESCRIPTION" .SH "DESCRIPTION"
.TS Populates the file matching \fIauthors|contributors \-i\fR with the authors of commits, according to the number of commits per author\. Opens the file in \fB$EDITOR\fR when set\.
allbox; .
Populates the file matching _authors contributors \-i_ with the authors of commits, according to the number of commits per author\.
.TE
.P .P
See the "MAPPING AUTHORS" section of \fBgit\-shortlog\fR(1) to coalesce together commits by the same person\. See the "MAPPING AUTHORS" section of \fBgit\-shortlog\fR(1) to coalesce together commits by the same person\.
.
.SH "OPTIONS" .SH "OPTIONS"
\-l, \-\-list \-l, \-\-list
.
.P .P
Show authors\. Show authors\.
.
.P .P
\-\-no\-email \-\-no\-email
.
.P .P
Don\'t show authors\' email\. Don\'t show authors\' email\.
.
.SH "EXAMPLES" .SH "EXAMPLES"
.
.TP
Updating AUTHORS file: Updating AUTHORS file:
.IP "" 4 .
.nf .IP
$ git authors $ git authors
.fi .
.IP "" 0 .TP
.P
Listing authors: Listing authors:
.IP "" 4 .
.nf .IP
$ git authors \-\-list $ git authors \-\-list
.
.IP "" 4
.
.nf
TJ Holowaychuk <tj@vision\-media\.ca> TJ Holowaychuk <tj@vision\-media\.ca>
hemanth\.hm <hemanth\.hm@gmail\.com> hemanth\.hm <hemanth\.hm@gmail\.com>
Jonhnny Weslley <jw@jonhnnyweslley\.net> Jonhnny Weslley <jw@jonhnnyweslley\.net>
nickl\- <github@jigsoft\.co\.za> nickl\- <github@jigsoft\.co\.za>
Leila Muhtasib <muhtasib@gmail\.com> Leila Muhtasib <muhtasib@gmail\.com>
.
.fi .fi
.
.IP "" 0 .IP "" 0
.P
.
.TP
Listing authors without email: Listing authors without email:
.IP "" 4 .
.nf .IP
$ git authors \-\-list \-\-no\-email $ git authors \-\-list \-\-no\-email
.
.IP "" 4
.
.nf
TJ Holowaychuk TJ Holowaychuk
hemanth\.hm hemanth\.hm
Jonhnny Weslley Jonhnny Weslley
nickl\- nickl\-
Leila Muhtasib Leila Muhtasib
.
.fi .fi
.
.IP "" 0 .IP "" 0
.
.SH "AUTHOR" .SH "AUTHOR"
Written by Titus Wormer <\fItituswormer@gmail\.com\fR> Written by Titus Wormer <\fItituswormer@gmail\.com\fR>
.
.SH "REPORTING BUGS" .SH "REPORTING BUGS"
<\fIhttps://github\.com/tj/git\-extras/issues\fR> <\fIhttps://github\.com/tj/git\-extras/issues\fR>
.
.SH "SEE ALSO" .SH "SEE ALSO"
<\fIhttps://github\.com/tj/git\-extras\fR> <\fIhttps://github\.com/tj/git\-extras\fR>

View file

@ -1,8 +1,8 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<meta http-equiv='content-type' content='text/html;charset=utf8'> <meta http-equiv='content-type' value='text/html;charset=utf8'>
<meta name='generator' content='Ronn-NG/v0.9.1 (http://github.com/apjanke/ronn-ng/tree/0.9.1)'> <meta name='generator' value='Ronn/v0.7.3 (http://github.com/rtomayko/ronn/tree/0.7.3)'>
<title>git-authors(1) - Generate authors report</title> <title>git-authors(1) - Generate authors report</title>
<style type='text/css' media='all'> <style type='text/css' media='all'>
/* style: man */ /* style: man */
@ -69,69 +69,64 @@
<li class='tr'>git-authors(1)</li> <li class='tr'>git-authors(1)</li>
</ol> </ol>
<h2 id="NAME">NAME</h2>
<h2 id="NAME">NAME</h2>
<p class="man-name"> <p class="man-name">
<code>git-authors</code> - <span class="man-whatis">Generate authors report</span> <code>git-authors</code> - <span class="man-whatis">Generate authors report</span>
</p> </p>
<h2 id="SYNOPSIS">SYNOPSIS</h2> <h2 id="SYNOPSIS">SYNOPSIS</h2>
<p><code>git-authors</code> [-l, --list] [--no-email]</p> <p><code>git-authors</code> [-l, --list] [--no-email]</p>
<h2 id="DESCRIPTION">DESCRIPTION</h2> <h2 id="DESCRIPTION">DESCRIPTION</h2>
<table> <p> Populates the file matching <em>authors|contributors -i</em> with the authors of commits, according to the number of commits per author.
<tbody> Opens the file in <strong>$EDITOR</strong> when set.</p>
<tr>
<td>Populates the file matching _authors</td>
<td>contributors -i_ with the authors of commits, according to the number of commits per author.</td>
</tr>
</tbody>
</table>
<p>See the "MAPPING AUTHORS" section of <strong>git-shortlog</strong>(1) to coalesce together commits by the same person.</p> <p> See the "MAPPING AUTHORS" section of <strong>git-shortlog</strong>(1) to coalesce together commits by the same person.</p>
<h2 id="OPTIONS">OPTIONS</h2> <h2 id="OPTIONS">OPTIONS</h2>
<p>-l, --list</p> <p> -l, --list</p>
<p>Show authors.</p> <p> Show authors.</p>
<p>--no-email</p> <p> --no-email</p>
<p>Don't show authors' email.</p> <p> Don't show authors' email.</p>
<h2 id="EXAMPLES">EXAMPLES</h2> <h2 id="EXAMPLES">EXAMPLES</h2>
<p>Updating AUTHORS file:</p> <dl>
<dt>Updating AUTHORS file:</dt><dd><p></p>
<pre><code>$ git authors <p>$ git authors</p></dd>
</code></pre> <dt>Listing authors:</dt><dd><p></p>
<p>Listing authors:</p> <p>$ git authors --list</p>
<pre><code>$ git authors --list <pre><code>TJ Holowaychuk &lt;tj@vision-media.ca&gt;
TJ Holowaychuk &lt;tj@vision-media.ca&gt;
hemanth.hm &lt;hemanth.hm@gmail.com&gt; hemanth.hm &lt;hemanth.hm@gmail.com&gt;
Jonhnny Weslley &lt;jw@jonhnnyweslley.net&gt; Jonhnny Weslley &lt;jw@jonhnnyweslley.net&gt;
nickl- &lt;github@jigsoft.co.za&gt; nickl- &lt;github@jigsoft.co.za&gt;
Leila Muhtasib &lt;muhtasib@gmail.com&gt; Leila Muhtasib &lt;muhtasib@gmail.com&gt;
</code></pre> </code></pre></dd>
<dt>Listing authors without email:</dt><dd><p></p>
<p>Listing authors without email:</p> <p>$ git authors --list --no-email</p>
<pre><code>$ git authors --list --no-email <pre><code>TJ Holowaychuk
TJ Holowaychuk
hemanth.hm hemanth.hm
Jonhnny Weslley Jonhnny Weslley
nickl- nickl-
Leila Muhtasib Leila Muhtasib
</code></pre> </code></pre></dd>
</dl>
<h2 id="AUTHOR">AUTHOR</h2> <h2 id="AUTHOR">AUTHOR</h2>
<p>Written by Titus Wormer &lt;<a href="mailto:tituswormer@gmail.com" data-bare-link="true">tituswormer@gmail.com</a>&gt;</p> <p>Written by Titus Wormer &lt;<a href="&#x6d;&#x61;&#x69;&#x6c;&#116;&#111;&#58;&#x74;&#105;&#116;&#x75;&#x73;&#x77;&#x6f;&#x72;&#x6d;&#x65;&#114;&#64;&#103;&#109;&#97;&#x69;&#108;&#46;&#99;&#111;&#x6d;" data-bare-link="true">&#x74;&#105;&#116;&#x75;&#x73;&#x77;&#111;&#114;&#109;&#101;&#x72;&#64;&#103;&#x6d;&#x61;&#x69;&#108;&#x2e;&#99;&#x6f;&#x6d;</a>&gt;</p>
<h2 id="REPORTING-BUGS">REPORTING BUGS</h2> <h2 id="REPORTING-BUGS">REPORTING BUGS</h2>
@ -141,9 +136,10 @@ Leila Muhtasib
<p>&lt;<a href="https://github.com/tj/git-extras" data-bare-link="true">https://github.com/tj/git-extras</a>&gt;</p> <p>&lt;<a href="https://github.com/tj/git-extras" data-bare-link="true">https://github.com/tj/git-extras</a>&gt;</p>
<ol class='man-decor man-foot man foot'> <ol class='man-decor man-foot man foot'>
<li class='tl'></li> <li class='tl'></li>
<li class='tc'>November 2023</li> <li class='tc'>October 2017</li>
<li class='tr'>git-authors(1)</li> <li class='tr'>git-authors(1)</li>
</ol> </ol>

View file

@ -8,6 +8,7 @@ git-authors(1) -- Generate authors report
## DESCRIPTION ## DESCRIPTION
Populates the file matching _authors|contributors -i_ with the authors of commits, according to the number of commits per author. Populates the file matching _authors|contributors -i_ with the authors of commits, according to the number of commits per author.
Opens the file in **$EDITOR** when set.
See the "MAPPING AUTHORS" section of **git-shortlog**(1) to coalesce together commits by the same person. See the "MAPPING AUTHORS" section of **git-shortlog**(1) to coalesce together commits by the same person.
@ -23,27 +24,33 @@ git-authors(1) -- Generate authors report
## EXAMPLES ## EXAMPLES
Updating AUTHORS file: * Updating AUTHORS file:
$ git authors $ git authors
Listing authors: * Listing authors:
$ git authors --list $ git authors --list
```
TJ Holowaychuk <tj@vision-media.ca> TJ Holowaychuk <tj@vision-media.ca>
hemanth.hm <hemanth.hm@gmail.com> hemanth.hm <hemanth.hm@gmail.com>
Jonhnny Weslley <jw@jonhnnyweslley.net> Jonhnny Weslley <jw@jonhnnyweslley.net>
nickl- <github@jigsoft.co.za> nickl- <github@jigsoft.co.za>
Leila Muhtasib <muhtasib@gmail.com> Leila Muhtasib <muhtasib@gmail.com>
```
Listing authors without email: * Listing authors without email:
$ git authors --list --no-email $ git authors --list --no-email
```
TJ Holowaychuk TJ Holowaychuk
hemanth.hm hemanth.hm
Jonhnny Weslley Jonhnny Weslley
nickl- nickl-
Leila Muhtasib Leila Muhtasib
```
## AUTHOR ## AUTHOR

View file

@ -1,23 +1,34 @@
.\" generated with Ronn-NG/v0.10.1 .\" generated with Ronn/v0.7.3
.\" http://github.com/apjanke/ronn-ng/tree/0.10.1 .\" http://github.com/rtomayko/ronn/tree/0.7.3
.TH "GIT\-BROWSE\-CI" "1" "March 2026" "" "Git Extras" .
.TH "GIT\-BROWSE\-CI" "1" "March 2022" "" "Git Extras"
.
.SH "NAME" .SH "NAME"
\fBgit\-browse\-ci\fR \- View the CI page for the current repository \fBgit\-browse\-ci\fR \-
.
.SH "SYNOPSIS" .SH "SYNOPSIS"
\fBgit\-browse\-ci\fR [<remote_name>] \fBgit\-browse\-ci\fR [remote_name]
.
.SH "DESCRIPTION" .SH "DESCRIPTION"
Opens the current git repository CI page in your default web browser\. Opens the current git repository CI page in your default web browser\.
.
.SH "OPTIONS" .SH "OPTIONS"
<remote_name> <remote_name>
.
.P .P
The name of the remote you wish to browse to\. Defaults to the current branch's configured remote, or \fBorigin\fR if not specified\. The name of the remote you wish to browse to\. Defaults to the first remote if not specified\.
.
.SH "EXAMPLES" .SH "EXAMPLES"
$ git browse\-ci $ git browse\-ci
.
.P .P
$ git browse\-ci upstream $ git browse\-ci upstream
.
.SH "AUTHOR" .SH "AUTHOR"
Written by Peter Benjamin <\fIhttps://github\.com/pbnj\fR> Written by Peter Benjamin <\fIhttps://github\.com/pbnj\fR>
.
.SH "REPORTING BUGS" .SH "REPORTING BUGS"
<\fIhttps://github\.com/tj/git\-extras/issues\fR> <\fIhttps://github\.com/tj/git\-extras/issues\fR>
.
.SH "SEE ALSO" .SH "SEE ALSO"
<\fIhttps://github\.com/tj/git\-extras\fR> <\fIhttps://github\.com/tj/git\-extras\fR>

View file

@ -1,9 +1,9 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<meta http-equiv='content-type' content='text/html;charset=utf-8'> <meta http-equiv='content-type' value='text/html;charset=utf8'>
<meta name='generator' content='Ronn-NG/v0.10.1 (http://github.com/apjanke/ronn-ng/tree/0.10.1)'> <meta name='generator' value='Ronn/v0.7.3 (http://github.com/rtomayko/ronn/tree/0.7.3)'>
<title>git-browse-ci(1) - View the CI page for the current repository</title> <title>git-browse-ci(1) - &lt;View the web page for the current repository&gt;</title>
<style type='text/css' media='all'> <style type='text/css' media='all'>
/* style: man */ /* style: man */
body#manpage {margin:0} body#manpage {margin:0}
@ -69,15 +69,14 @@
<li class='tr'>git-browse-ci(1)</li> <li class='tr'>git-browse-ci(1)</li>
</ol> </ol>
<h2 id="NAME">NAME</h2>
<h2 id="NAME">NAME</h2>
<p class="man-name"> <p class="man-name">
<code>git-browse-ci</code> - <span class="man-whatis">View the CI page for the current repository</span> <code>git-browse-ci</code> - <span class="man-whatis"><view the web page for current repository /></span>
</p> </p>
<h2 id="SYNOPSIS">SYNOPSIS</h2> <h2 id="SYNOPSIS">SYNOPSIS</h2>
<p><code>git-browse-ci</code> [&lt;remote_name&gt;]</p> <p><code>git-browse-ci</code> [remote_name]</p>
<h2 id="DESCRIPTION">DESCRIPTION</h2> <h2 id="DESCRIPTION">DESCRIPTION</h2>
@ -87,14 +86,14 @@
<p>&lt;remote_name&gt;</p> <p>&lt;remote_name&gt;</p>
<p>The name of the remote you wish to browse to. Defaults to the current <p>The name of the remote you wish to browse to. Defaults to
branch's configured remote, or <code>origin</code> if not specified.</p> the first remote if not specified.</p>
<h2 id="EXAMPLES">EXAMPLES</h2> <h2 id="EXAMPLES">EXAMPLES</h2>
<p>$ git browse-ci</p> <p> $ git browse-ci</p>
<p>$ git browse-ci upstream</p> <p> $ git browse-ci upstream</p>
<h2 id="AUTHOR">AUTHOR</h2> <h2 id="AUTHOR">AUTHOR</h2>
@ -108,9 +107,10 @@ branch's configured remote, or <code>origin</code> if not specified.</p>
<p>&lt;<a href="https://github.com/tj/git-extras" data-bare-link="true">https://github.com/tj/git-extras</a>&gt;</p> <p>&lt;<a href="https://github.com/tj/git-extras" data-bare-link="true">https://github.com/tj/git-extras</a>&gt;</p>
<ol class='man-decor man-foot man foot'> <ol class='man-decor man-foot man foot'>
<li class='tl'></li> <li class='tl'></li>
<li class='tc'>March 2026</li> <li class='tc'>March 2022</li>
<li class='tr'>git-browse-ci(1)</li> <li class='tr'>git-browse-ci(1)</li>
</ol> </ol>

View file

@ -1,9 +1,9 @@
git-browse-ci(1) -- View the CI page for the current repository git-browse-ci(1) -- <View the web page for the current repository>
================================ ================================
## SYNOPSIS ## SYNOPSIS
`git-browse-ci` [&lt;remote_name&gt;] `git-browse-ci` [remote_name]
## DESCRIPTION ## DESCRIPTION
@ -13,8 +13,8 @@ Opens the current git repository CI page in your default web browser.
&lt;remote_name&gt; &lt;remote_name&gt;
The name of the remote you wish to browse to. Defaults to the current The name of the remote you wish to browse to. Defaults to
branch's configured remote, or `origin` if not specified. the first remote if not specified.
## EXAMPLES ## EXAMPLES

View file

@ -1,41 +1,61 @@
.\" generated with Ronn-NG/v0.10.1 .\" generated with Ronn/v0.7.3
.\" http://github.com/apjanke/ronn-ng/tree/0.10.1 .\" http://github.com/rtomayko/ronn/tree/0.7.3
.TH "GIT\-BROWSE" "1" "March 2026" "" "Git Extras" .
.TH "GIT\-BROWSE" "1" "June 2022" "" "Git Extras"
.
.SH "NAME" .SH "NAME"
\fBgit\-browse\fR \- View the web page for the current repository \fBgit\-browse\fR \-
.
.SH "SYNOPSIS" .SH "SYNOPSIS"
\fBgit\-browse\fR [REMOTE\-NAME] [FILE\-NAME] [LINE\-1] [LINE\-2] \fBgit\-browse\fR [remote_name] [file_name] [line_1] [line_2]
.
.SH "DESCRIPTION" .SH "DESCRIPTION"
Opens the current git repository website in your default web browser\. Opens the current git repository website in your default web browser\.
.
.SH "OPTIONS" .SH "OPTIONS"
REMOTE\-NAME <remote_name>
.
.P .P
The name of the remote you wish to browse to\. Defaults to the first remote if not specified\. The name of the remote you wish to browse to\. Defaults to the first remote if not specified\.
.
.P .P
FILE\-NAME <file_name>
.
.P .P
The name of the file you wish to browse to\. The name of the file you wish to browse to\.
.
.P .P
LINE\-1 <line_1>
.
.P .P
The line number of the file you wish to browse to\. The line number of the file you wish to browse to\.
.
.P .P
LINE\-2 <line_2>
.
.P .P
The line range (from LINE\-1 to LINE\-2) of the file you wish to browse to\. The line range (from <line_1> to <line_2>) of the file you wish to browse to\.
.
.SH "EXAMPLES" .SH "EXAMPLES"
$ git browse $ git browse
.
.P .P
$ git browse upstream $ git browse upstream
.
.P .P
$ git browse upstream bin/git\-browse $ git browse upstream bin/git\-browse
.
.P .P
$ git browse upstream bin/git\-browse 42 $ git browse upstream bin/git\-browse 42
.
.P .P
$ git browse upstream bin/git\-browse 1 42 $ git browse upstream bin/git\-browse 1 42
.
.SH "AUTHOR" .SH "AUTHOR"
Written by Mark Pitman <\fIhttps://github\.com/mapitman\fR> Written by Mark Pitman <\fIhttps://github\.com/mapitman\fR>
.
.SH "REPORTING BUGS" .SH "REPORTING BUGS"
<\fIhttps://github\.com/tj/git\-extras/issues\fR> <\fIhttps://github\.com/tj/git\-extras/issues\fR>
.
.SH "SEE ALSO" .SH "SEE ALSO"
<\fIhttps://github\.com/tj/git\-extras\fR> <\fIhttps://github\.com/tj/git\-extras\fR>

View file

@ -1,9 +1,9 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<meta http-equiv='content-type' content='text/html;charset=utf-8'> <meta http-equiv='content-type' value='text/html;charset=utf8'>
<meta name='generator' content='Ronn-NG/v0.10.1 (http://github.com/apjanke/ronn-ng/tree/0.10.1)'> <meta name='generator' value='Ronn/v0.7.3 (http://github.com/rtomayko/ronn/tree/0.7.3)'>
<title>git-browse(1) - View the web page for the current repository</title> <title>git-browse(1) - &lt;View the web page for the current repository&gt;</title>
<style type='text/css' media='all'> <style type='text/css' media='all'>
/* style: man */ /* style: man */
body#manpage {margin:0} body#manpage {margin:0}
@ -69,15 +69,14 @@
<li class='tr'>git-browse(1)</li> <li class='tr'>git-browse(1)</li>
</ol> </ol>
<h2 id="NAME">NAME</h2>
<h2 id="NAME">NAME</h2>
<p class="man-name"> <p class="man-name">
<code>git-browse</code> - <span class="man-whatis">View the web page for the current repository</span> <code>git-browse</code> - <span class="man-whatis"><view the web page for current repository /></span>
</p> </p>
<h2 id="SYNOPSIS">SYNOPSIS</h2> <h2 id="SYNOPSIS">SYNOPSIS</h2>
<p><code>git-browse</code> [REMOTE-NAME] [FILE-NAME] [LINE-1] [LINE-2]</p> <p><code>git-browse</code> [remote_name] [file_name] [line_1] [line_2]</p>
<h2 id="DESCRIPTION">DESCRIPTION</h2> <h2 id="DESCRIPTION">DESCRIPTION</h2>
@ -85,35 +84,35 @@
<h2 id="OPTIONS">OPTIONS</h2> <h2 id="OPTIONS">OPTIONS</h2>
<p>REMOTE-NAME</p> <p>&lt;remote_name&gt;</p>
<p>The name of the remote you wish to browse to. Defaults to <p>The name of the remote you wish to browse to. Defaults to
the first remote if not specified.</p> the first remote if not specified.</p>
<p>FILE-NAME</p> <p>&lt;file_name&gt;</p>
<p>The name of the file you wish to browse to.</p> <p>The name of the file you wish to browse to.</p>
<p>LINE-1</p> <p>&lt;line_1&gt;</p>
<p>The line number of the file you wish to browse to.</p> <p>The line number of the file you wish to browse to.</p>
<p>LINE-2</p> <p>&lt;line_2&gt;</p>
<p>The line range (from LINE-1 to LINE-2) of the file you wish to <p>The line range (from &lt;line_1&gt; to &lt;line_2&gt;) of the file you wish to
browse to.</p> browse to.</p>
<h2 id="EXAMPLES">EXAMPLES</h2> <h2 id="EXAMPLES">EXAMPLES</h2>
<p>$ git browse</p> <p> $ git browse</p>
<p>$ git browse upstream</p> <p> $ git browse upstream</p>
<p>$ git browse upstream bin/git-browse</p> <p> $ git browse upstream bin/git-browse</p>
<p>$ git browse upstream bin/git-browse 42</p> <p> $ git browse upstream bin/git-browse 42</p>
<p>$ git browse upstream bin/git-browse 1 42</p> <p> $ git browse upstream bin/git-browse 1 42</p>
<h2 id="AUTHOR">AUTHOR</h2> <h2 id="AUTHOR">AUTHOR</h2>
@ -127,9 +126,10 @@ browse to.</p>
<p>&lt;<a href="https://github.com/tj/git-extras" data-bare-link="true">https://github.com/tj/git-extras</a>&gt;</p> <p>&lt;<a href="https://github.com/tj/git-extras" data-bare-link="true">https://github.com/tj/git-extras</a>&gt;</p>
<ol class='man-decor man-foot man foot'> <ol class='man-decor man-foot man foot'>
<li class='tl'></li> <li class='tl'></li>
<li class='tc'>March 2026</li> <li class='tc'>June 2022</li>
<li class='tr'>git-browse(1)</li> <li class='tr'>git-browse(1)</li>
</ol> </ol>

View file

@ -1,9 +1,9 @@
git-browse(1) -- View the web page for the current repository git-browse(1) -- <View the web page for the current repository>
================================ ================================
## SYNOPSIS ## SYNOPSIS
`git-browse` [REMOTE-NAME] [FILE-NAME] [LINE-1] [LINE-2] `git-browse` [remote_name] [file_name] [line_1] [line_2]
## DESCRIPTION ## DESCRIPTION
@ -11,22 +11,22 @@ Opens the current git repository website in your default web browser.
## OPTIONS ## OPTIONS
REMOTE-NAME &lt;remote_name&gt;
The name of the remote you wish to browse to. Defaults to The name of the remote you wish to browse to. Defaults to
the first remote if not specified. the first remote if not specified.
FILE-NAME &lt;file_name&gt;
The name of the file you wish to browse to. The name of the file you wish to browse to.
LINE-1 &lt;line_1&gt;
The line number of the file you wish to browse to. The line number of the file you wish to browse to.
LINE-2 &lt;line_2&gt;
The line range (from LINE-1 to LINE-2) of the file you wish to The line range (from &lt;line_1&gt; to &lt;line_2&gt;) of the file you wish to
browse to. browse to.
## EXAMPLES ## EXAMPLES

View file

@ -1,23 +1,17 @@
.\" generated with Ronn/v0.7.3 .\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3
. .
.TH "GIT\-BRV" "1" "December 2023" "" "Git Extras" .TH "GIT\-BRV" "1" "January 2020" "" "Git Extras"
. .
.SH "NAME" .SH "NAME"
\fBgit\-brv\fR \- List branches sorted by their last commit date \fBgit\-brv\fR \- List branches sorted by their last commit date
. .
.SH "SYNOPSIS" .SH "SYNOPSIS"
\fBgit\-brv\fR [\-r|\-\-reverse] \fBgit\-brv\fR
. .
.SH "DESCRIPTION" .SH "DESCRIPTION"
Pretty listing of branches sorted by the date of their last commit\. Pretty listing of branches sorted by the date of their last commit\.
. .
.SH "OPTIONS"
\-r | \-\-reverse
.
.P
Reverses the output to put the most recent branch at the bottom of the list\. This is useful when there are large amount of branches as the most recent branch is shown just above the next prompt\. This can be configured as the default by setting \fBgit\-extras\.brv\.reverse\fR to true in your git options\.
.
.SH "EXAMPLES" .SH "EXAMPLES"
Simply run \fBgit brv\fR Simply run \fBgit brv\fR
. .
@ -33,21 +27,6 @@ $ git brv
. .
.IP "" 0 .IP "" 0
. .
.P
To display the rows in reverse order: \fBgit brv \-\-reverse\fR
.
.IP "" 4
.
.nf
$ git brv \-\-reverse
2020\-01\-08 master origin/master 265b03e Merge pull request #816 from spacewander/git\-sed\-pathspec
2020\-01\-14 adds\-git\-brv fork/adds\-git\-brv 1ca0d76 Fixes #700: Adds git\-brv
.
.fi
.
.IP "" 0
.
.SH "AUTHOR" .SH "AUTHOR"
Written by Øsse <\fIhttps://github\.com/Osse\fR> Written by Øsse <\fIhttps://github\.com/Osse\fR>
. .

View file

@ -56,7 +56,6 @@
<a href="#NAME">NAME</a> <a href="#NAME">NAME</a>
<a href="#SYNOPSIS">SYNOPSIS</a> <a href="#SYNOPSIS">SYNOPSIS</a>
<a href="#DESCRIPTION">DESCRIPTION</a> <a href="#DESCRIPTION">DESCRIPTION</a>
<a href="#OPTIONS">OPTIONS</a>
<a href="#EXAMPLES">EXAMPLES</a> <a href="#EXAMPLES">EXAMPLES</a>
<a href="#AUTHOR">AUTHOR</a> <a href="#AUTHOR">AUTHOR</a>
<a href="#REPORTING-BUGS">REPORTING BUGS</a> <a href="#REPORTING-BUGS">REPORTING BUGS</a>
@ -76,18 +75,12 @@
<h2 id="SYNOPSIS">SYNOPSIS</h2> <h2 id="SYNOPSIS">SYNOPSIS</h2>
<p><code>git-brv</code> [-r|--reverse]</p> <p><code>git-brv</code></p>
<h2 id="DESCRIPTION">DESCRIPTION</h2> <h2 id="DESCRIPTION">DESCRIPTION</h2>
<p> Pretty listing of branches sorted by the date of their last commit.</p> <p> Pretty listing of branches sorted by the date of their last commit.</p>
<h2 id="OPTIONS">OPTIONS</h2>
<p> -r | --reverse</p>
<p> Reverses the output to put the most recent branch at the bottom of the list. This is useful when there are large amount of branches as the most recent branch is shown just above the next prompt. This can be configured as the default by setting <code>git-extras.brv.reverse</code> to true in your git options.</p>
<h2 id="EXAMPLES">EXAMPLES</h2> <h2 id="EXAMPLES">EXAMPLES</h2>
<p> Simply run <code>git brv</code></p> <p> Simply run <code>git brv</code></p>
@ -97,13 +90,6 @@
2020-01-08 master origin/master 265b03e Merge pull request #816 from spacewander/git-sed-pathspec 2020-01-08 master origin/master 265b03e Merge pull request #816 from spacewander/git-sed-pathspec
</code></pre> </code></pre>
<p> To display the rows in reverse order: <code>git brv --reverse</code></p>
<pre><code>$ git brv --reverse
2020-01-08 master origin/master 265b03e Merge pull request #816 from spacewander/git-sed-pathspec
2020-01-14 adds-git-brv fork/adds-git-brv 1ca0d76 Fixes #700: Adds git-brv
</code></pre>
<h2 id="AUTHOR">AUTHOR</h2> <h2 id="AUTHOR">AUTHOR</h2>
<p>Written by Øsse &lt;<a href="https://github.com/Osse" data-bare-link="true">https://github.com/Osse</a>&gt;</p> <p>Written by Øsse &lt;<a href="https://github.com/Osse" data-bare-link="true">https://github.com/Osse</a>&gt;</p>
@ -119,7 +105,7 @@
<ol class='man-decor man-foot man foot'> <ol class='man-decor man-foot man foot'>
<li class='tl'></li> <li class='tl'></li>
<li class='tc'>December 2023</li> <li class='tc'>January 2020</li>
<li class='tr'>git-brv(1)</li> <li class='tr'>git-brv(1)</li>
</ol> </ol>

View file

@ -3,18 +3,12 @@ git-brv(1) -- List branches sorted by their last commit date
## SYNOPSIS ## SYNOPSIS
`git-brv` [-r|--reverse] `git-brv`
## DESCRIPTION ## DESCRIPTION
Pretty listing of branches sorted by the date of their last commit. Pretty listing of branches sorted by the date of their last commit.
## OPTIONS
-r | --reverse
Reverses the output to put the most recent branch at the bottom of the list. This is useful when there are large amount of branches as the most recent branch is shown just above the next prompt. This can be configured as the default by setting `git-extras.brv.reverse` to true in your git options.
## EXAMPLES ## EXAMPLES
Simply run `git brv` Simply run `git brv`
@ -23,11 +17,6 @@ git-brv(1) -- List branches sorted by their last commit date
2020-01-14 adds-git-brv fork/adds-git-brv 1ca0d76 Fixes #700: Adds git-brv 2020-01-14 adds-git-brv fork/adds-git-brv 1ca0d76 Fixes #700: Adds git-brv
2020-01-08 master origin/master 265b03e Merge pull request #816 from spacewander/git-sed-pathspec 2020-01-08 master origin/master 265b03e Merge pull request #816 from spacewander/git-sed-pathspec
To display the rows in reverse order: `git brv --reverse`
$ git brv --reverse
2020-01-08 master origin/master 265b03e Merge pull request #816 from spacewander/git-sed-pathspec
2020-01-14 adds-git-brv fork/adds-git-brv 1ca0d76 Fixes #700: Adds git-brv
## AUTHOR ## AUTHOR

View file

@ -1,82 +1,108 @@
.\" generated with Ronn-NG/v0.10.1 .\" generated with Ronn/v0.7.3
.\" http://github.com/apjanke/ronn-ng/tree/0.10.1 .\" http://github.com/rtomayko/ronn/tree/0.7.3
.TH "GIT\-BULK" "1" "March 2026" "" "Git Extras" .
.TH "GIT\-BULK" "1" "August 2020" "" "Git Extras"
.
.SH "NAME" .SH "NAME"
\fBgit\-bulk\fR \- Run git commands on multiple repositories \fBgit\-bulk\fR \- Run git commands on multiple repositories
.
.SH "SYNOPSIS" .SH "SYNOPSIS"
.nf git bulk [\-g] ([\-a]|[\-w <ws\-name>]) <git command>
git\-bulk [\-q|\-\-quiet] [\-g] [\-\-no\-follow\-symlinks] [\-\-no\-follow\-hidden] ([\-a]|[\-w WS\-NAME]) GIT\-COMMAND .
git\-bulk \-\-addworkspace WS\-NAME WS\-ROOT\-DIRECTORY (\-\-from URL\-OR\-FILE) .br
git\-bulk \-\-removeworkspace WS\-NAME git bulk \-\-addworkspace <ws\-name> <ws\-root\-directory> (\-\-from <URL or file>)
git\-bulk \-\-addcurrent WS\-NAME .
git\-bulk \-\-purge .br
git\-bulk \-\-listall git bulk \-\-removeworkspace <ws\-name>
.fi .
.br
git bulk \-\-addcurrent <ws\-name>
.
.br
git bulk \-\-purge
.
.br
git bulk \-\-listall
.
.SH "DESCRIPTION" .SH "DESCRIPTION"
git bulk adds convenient support for operations that you want to execute on multiple git repositories\. git bulk adds convenient support for operations that you want to execute on multiple git repositories\.
.
.IP "\(bu" 4 .IP "\(bu" 4
simply register workspaces that contain multiple git repos in their directory structure simply register workspaces that contain multiple git repos in their directory structure
.
.IP "\(bu" 4 .IP "\(bu" 4
run any git command on the repositories of the registered workspaces in one command to \fBgit bulk\fR run any git command on the repositories of the registered workspaces in one command to \fBgit bulk\fR
.
.IP "\(bu" 4 .IP "\(bu" 4
use the "guarded mode" to check on each execution use the "guarded mode" to check on each execution
.
.IP "" 0 .IP "" 0
.
.SH "OPTIONS" .SH "OPTIONS"
\-a \-a
.
.P .P
Run a git command on all workspaces and their repositories\. Run a git command on all workspaces and their repositories\.
.
.P .P
\-g \-g
.
.P .P
Ask the user for confirmation on every execution\. Ask the user for confirmation on every execution\.
.
.P .P
\-\-no\-follow\-symlinks \-w <ws\-name>
.P .
Do not traverse symbolic links under the workspace when searching for git repositories\.
.P
\-\-no\-follow\-hidden
.P
Do not traverse hidden (dotted) directories under the workspace when searching for git repositories\.
.P
\-w WS\-NAME
.P .P
Run the git command on the specified workspace\. The workspace must be registered\. Run the git command on the specified workspace\. The workspace must be registered\.
.
.P .P
GIT\-COMMAND <git command>
.
.P .P
Any git Command you wish to execute on the repositories\. Any git Command you wish to execute on the repositories\.
.
.P .P
\-\-addworkspace WS\-NAME WS\-ROOT\-DIRECTORY (\-\-from URL\-OR\-FILE) \-\-addworkspace <ws\-name> <ws\-root\-directory> (\-\-from <URL or file&rt;gt;)
.
.P .P
Register a workspace for bulk operations\. All repositories in the directories below WS\-ROOT\-DIRECTORY get registered under this workspace with the name WS\-NAME\. WS\-ROOT\-DIRECTORY must be an absolute path\. Register a workspace for bulk operations\. All repositories in the directories below <ws\-root\-directory> get registered under this workspace with the name <ws\-name>\. <ws\-root\-directory> must be absolute path\.
.
.P .P
With option '\-\-from' the URL to a single repository or a file containing multiple URLs can be added and they will be cloned directly into the workspace\. Suitable for the initial setup of a multi\-repo project\. With option \'\-\-from\' the URL to a single repository or a file containing multiple URLs can be added and they will be cloned directly into the workspace\. Suitable for the initial setup of a multi\-repo project\.
.
.P .P
\-\-removeworkspace WS\-NAME \-\-removeworkspace <ws\-name>
.
.P .P
Remove the workspace with the logical name WS\-NAME\. Remove the workspace with the logical name <ws\-name>\.
.
.P .P
\-\-addcurrent WS\-NAME \-\-addcurrent <ws\-name>
.
.P .P
Adds the current directory as workspace to git bulk operations\. The workspace is referenced with its logical name WS\-NAME\. Adds the current directory as workspace to git bulk operations\. The workspace is referenced with its logical name <ws\-name>\.
.
.P .P
git bulk \-\-purge git bulk \-\-purge
.
.P .P
Removes all defined repository locations\. Removes all defined repository locations\.
.
.P .P
git bulk \-\-listall git bulk \-\-listall
.
.P .P
List all registered repositories\. List all registered repositories\.
.
.SH "EXAMPLES" .SH "EXAMPLES"
.
.nf .nf
Register a workspace so that git bulk knows about it using an absolute path:
Register a workspace so that git bulk knows about it:
$ git bulk \-\-addworkspace personal ~/workspaces/personal $ git bulk \-\-addworkspace personal ~/workspaces/personal
Or register a workspace using an environment variable pointing to an absolute path:
$ git bulk \-\-addworkspace personal '$PERSONAL_WORKSPACE'
Use option \-\-from in order to directly clone a repository or multiple repositories Use option \-\-from in order to directly clone a repository or multiple repositories
$ git bulk \-\-addworkspace personal ~/workspaces/personal \-\-from https://github\.com/tj/git\-extras\.git $ git bulk \-\-addworkspace personal ~/workspaces/personal \-\-from https://github\.com/tj/git\-extras\.git
@ -116,14 +142,14 @@ $ git bulk \-\-removeworkspace personal
Remove all registered workspaces: Remove all registered workspaces:
$ git bulk \-\-purge $ git bulk \-\-purge
.
.fi .fi
.SH "FILES" .
.IP "\(bu" 4
\fB\.gitconfig\fR: Store the \fBgit\-bulk\fR registered workspaces under the \fBbulkworkspaces\fR key\.
.IP "" 0
.SH "AUTHOR" .SH "AUTHOR"
Written by Niklas Schlimm <\fIns103@hotmail\.de\fR> Written by Niklas Schlimm <\fIns103@hotmail\.de\fR>
.
.SH "REPORTING BUGS" .SH "REPORTING BUGS"
<https://github\.com/nschlimm/git\-bulk> <https://github\.com/nschlimm/git\-bulk>
.
.SH "SEE ALSO" .SH "SEE ALSO"
<\fIhttps://github\.com/tj/git\-extras\fR> <\fIhttps://github\.com/tj/git\-extras\fR>

View file

@ -1,8 +1,8 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<meta http-equiv='content-type' content='text/html;charset=utf-8'> <meta http-equiv='content-type' value='text/html;charset=utf8'>
<meta name='generator' content='Ronn-NG/v0.10.1 (http://github.com/apjanke/ronn-ng/tree/0.10.1)'> <meta name='generator' value='Ronn/v0.7.3 (http://github.com/rtomayko/ronn/tree/0.7.3)'>
<title>git-bulk(1) - Run git commands on multiple repositories</title> <title>git-bulk(1) - Run git commands on multiple repositories</title>
<style type='text/css' media='all'> <style type='text/css' media='all'>
/* style: man */ /* style: man */
@ -58,7 +58,6 @@
<a href="#DESCRIPTION">DESCRIPTION</a> <a href="#DESCRIPTION">DESCRIPTION</a>
<a href="#OPTIONS">OPTIONS</a> <a href="#OPTIONS">OPTIONS</a>
<a href="#EXAMPLES">EXAMPLES</a> <a href="#EXAMPLES">EXAMPLES</a>
<a href="#FILES">FILES</a>
<a href="#AUTHOR">AUTHOR</a> <a href="#AUTHOR">AUTHOR</a>
<a href="#REPORTING-BUGS">REPORTING BUGS</a> <a href="#REPORTING-BUGS">REPORTING BUGS</a>
<a href="#SEE-ALSO">SEE ALSO</a> <a href="#SEE-ALSO">SEE ALSO</a>
@ -70,91 +69,77 @@
<li class='tr'>git-bulk(1)</li> <li class='tr'>git-bulk(1)</li>
</ol> </ol>
<h2 id="NAME">NAME</h2>
<h2 id="NAME">NAME</h2>
<p class="man-name"> <p class="man-name">
<code>git-bulk</code> - <span class="man-whatis">Run git commands on multiple repositories</span> <code>git-bulk</code> - <span class="man-whatis">Run git commands on multiple repositories</span>
</p> </p>
<h2 id="SYNOPSIS">SYNOPSIS</h2> <h2 id="SYNOPSIS">SYNOPSIS</h2>
<pre><code>git-bulk [-q|--quiet] [-g] [--no-follow-symlinks] [--no-follow-hidden] ([-a]|[-w WS-NAME]) GIT-COMMAND <p>git bulk [-g] ([-a]|[-w &lt;ws-name&gt;]) &lt;git command&gt; <br />
git-bulk --addworkspace WS-NAME WS-ROOT-DIRECTORY (--from URL-OR-FILE) git bulk --addworkspace &lt;ws-name&gt; &lt;ws-root-directory&gt; (--from &lt;URL or file&gt;) <br />
git-bulk --removeworkspace WS-NAME git bulk --removeworkspace &lt;ws-name&gt; <br />
git-bulk --addcurrent WS-NAME git bulk --addcurrent &lt;ws-name&gt; <br />
git-bulk --purge git bulk --purge <br />
git-bulk --listall git bulk --listall</p>
</code></pre>
<h2 id="DESCRIPTION">DESCRIPTION</h2> <h2 id="DESCRIPTION">DESCRIPTION</h2>
<p>git bulk adds convenient support for operations that you want to execute on multiple git repositories.</p> <p>git bulk adds convenient support for operations that you want to execute on multiple git repositories.</p>
<ul> <ul>
<li>simply register workspaces that contain multiple git repos in their directory structure</li> <li>simply register workspaces that contain multiple git repos in their directory structure</li>
<li>run any git command on the repositories of the registered workspaces in one command to <code>git bulk</code> <li>run any git command on the repositories of the registered workspaces in one command to <code>git bulk</code></li>
</li> <li>use the "guarded mode" to check on each execution</li>
<li>use the "guarded mode" to check on each execution</li>
</ul> </ul>
<h2 id="OPTIONS">OPTIONS</h2> <h2 id="OPTIONS">OPTIONS</h2>
<p>-a</p> <p> -a</p>
<p>Run a git command on all workspaces and their repositories.</p> <p> Run a git command on all workspaces and their repositories.</p>
<p>-g</p> <p> -g</p>
<p>Ask the user for confirmation on every execution.</p> <p> Ask the user for confirmation on every execution.</p>
<p>--no-follow-symlinks</p> <p> -w &lt;ws-name&gt;</p>
<p>Do not traverse symbolic links under the workspace when searching for git repositories.</p> <p> Run the git command on the specified workspace. The workspace must be registered.</p>
<p>--no-follow-hidden</p> <p> &lt;git command&gt;</p>
<p>Do not traverse hidden (dotted) directories under the workspace when searching for git repositories.</p> <p> Any git Command you wish to execute on the repositories.</p>
<p>-w WS-NAME</p> <p> --addworkspace &lt;ws-name&gt; &lt;ws-root-directory&gt; (--from &lt;URL or file&rt;gt;)</p>
<p>Run the git command on the specified workspace. The workspace must be registered.</p> <p> Register a workspace for bulk operations. All repositories in the directories below &lt;ws-root-directory&gt; get registered under this workspace with the name &lt;ws-name&gt;. &lt;ws-root-directory&gt; must be absolute path.</p>
<p>GIT-COMMAND</p> <p> With option '--from' the URL to a single repository or a file containing multiple URLs can be added and they will be cloned directly into the workspace. Suitable for the initial setup of a multi-repo project.</p>
<p>Any git Command you wish to execute on the repositories.</p> <p> --removeworkspace &lt;ws-name&gt;</p>
<p>--addworkspace WS-NAME WS-ROOT-DIRECTORY (--from URL-OR-FILE)</p> <p> Remove the workspace with the logical name &lt;ws-name&gt;.</p>
<p>Register a workspace for bulk operations. All repositories in the directories below WS-ROOT-DIRECTORY get registered under this workspace with the name WS-NAME. WS-ROOT-DIRECTORY must be an absolute path.</p> <p> --addcurrent &lt;ws-name&gt;</p>
<p>With option '--from' the URL to a single repository or a file containing multiple URLs can be added and they will be cloned directly into the workspace. Suitable for the initial setup of a multi-repo project.</p> <p> Adds the current directory as workspace to git bulk operations. The workspace is referenced with its logical name &lt;ws-name&gt;.</p>
<p>--removeworkspace WS-NAME</p> <p> git bulk --purge</p>
<p>Remove the workspace with the logical name WS-NAME.</p> <p> Removes all defined repository locations.</p>
<p>--addcurrent WS-NAME</p> <p> git bulk --listall</p>
<p>Adds the current directory as workspace to git bulk operations. The workspace is referenced with its logical name WS-NAME.</p> <p> List all registered repositories.</p>
<p>git bulk --purge</p>
<p>Removes all defined repository locations.</p>
<p>git bulk --listall</p>
<p>List all registered repositories.</p>
<h2 id="EXAMPLES">EXAMPLES</h2> <h2 id="EXAMPLES">EXAMPLES</h2>
<pre><code>Register a workspace so that git bulk knows about it using an absolute path: <pre><code>Register a workspace so that git bulk knows about it:
$ git bulk --addworkspace personal ~/workspaces/personal $ git bulk --addworkspace personal ~/workspaces/personal
Or register a workspace using an environment variable pointing to an absolute path:
$ git bulk --addworkspace personal '$PERSONAL_WORKSPACE'
Use option --from in order to directly clone a repository or multiple repositories Use option --from in order to directly clone a repository or multiple repositories
$ git bulk --addworkspace personal ~/workspaces/personal --from https://github.com/tj/git-extras.git $ git bulk --addworkspace personal ~/workspaces/personal --from https://github.com/tj/git-extras.git
@ -196,16 +181,9 @@ Remove all registered workspaces:
$ git bulk --purge $ git bulk --purge
</code></pre> </code></pre>
<h2 id="FILES">FILES</h2>
<ul>
<li>
<code>.gitconfig</code>: Store the <code>git-bulk</code> registered workspaces under the <code>bulkworkspaces</code> key.</li>
</ul>
<h2 id="AUTHOR">AUTHOR</h2> <h2 id="AUTHOR">AUTHOR</h2>
<p>Written by Niklas Schlimm &lt;<a href="mailto:ns103@hotmail.de" data-bare-link="true">ns103@hotmail.de</a>&gt;</p> <p>Written by Niklas Schlimm &lt;<a href="&#x6d;&#x61;&#105;&#108;&#x74;&#111;&#58;&#x6e;&#x73;&#x31;&#48;&#51;&#x40;&#x68;&#111;&#116;&#x6d;&#97;&#105;&#108;&#x2e;&#100;&#101;" data-bare-link="true">&#110;&#x73;&#x31;&#x30;&#51;&#x40;&#104;&#111;&#116;&#x6d;&#97;&#105;&#108;&#46;&#x64;&#x65;</a>&gt;</p>
<h2 id="REPORTING-BUGS">REPORTING BUGS</h2> <h2 id="REPORTING-BUGS">REPORTING BUGS</h2>
@ -215,9 +193,10 @@ $ git bulk --purge
<p>&lt;<a href="https://github.com/tj/git-extras" data-bare-link="true">https://github.com/tj/git-extras</a>&gt;</p> <p>&lt;<a href="https://github.com/tj/git-extras" data-bare-link="true">https://github.com/tj/git-extras</a>&gt;</p>
<ol class='man-decor man-foot man foot'> <ol class='man-decor man-foot man foot'>
<li class='tl'></li> <li class='tl'></li>
<li class='tc'>March 2026</li> <li class='tc'>August 2020</li>
<li class='tr'>git-bulk(1)</li> <li class='tr'>git-bulk(1)</li>
</ol> </ol>

View file

@ -3,12 +3,12 @@ git-bulk(1) -- Run git commands on multiple repositories
## SYNOPSIS ## SYNOPSIS
git-bulk [-q|--quiet] [-g] [--no-follow-symlinks] [--no-follow-hidden] ([-a]|[-w WS-NAME]) GIT-COMMAND git bulk [-g] ([-a]|[-w &lt;ws-name&gt;]) &lt;git command&gt; <br/>
git-bulk --addworkspace WS-NAME WS-ROOT-DIRECTORY (--from URL-OR-FILE) git bulk --addworkspace &lt;ws-name&gt; &lt;ws-root-directory&gt; (--from &lt;URL or file&gt;) <br/>
git-bulk --removeworkspace WS-NAME git bulk --removeworkspace &lt;ws-name&gt; <br/>
git-bulk --addcurrent WS-NAME git bulk --addcurrent &lt;ws-name&gt; <br/>
git-bulk --purge git bulk --purge <br/>
git-bulk --listall git bulk --listall
## DESCRIPTION ## DESCRIPTION
@ -28,35 +28,27 @@ git bulk adds convenient support for operations that you want to execute on mult
Ask the user for confirmation on every execution. Ask the user for confirmation on every execution.
--no-follow-symlinks -w &lt;ws-name&gt;
Do not traverse symbolic links under the workspace when searching for git repositories.
--no-follow-hidden
Do not traverse hidden (dotted) directories under the workspace when searching for git repositories.
-w WS-NAME
Run the git command on the specified workspace. The workspace must be registered. Run the git command on the specified workspace. The workspace must be registered.
GIT-COMMAND &lt;git command&gt;
Any git Command you wish to execute on the repositories. Any git Command you wish to execute on the repositories.
--addworkspace WS-NAME WS-ROOT-DIRECTORY (--from URL-OR-FILE) --addworkspace &lt;ws-name&gt; &lt;ws-root-directory&gt; (--from &lt;URL or file&rt;gt;)
Register a workspace for bulk operations. All repositories in the directories below WS-ROOT-DIRECTORY get registered under this workspace with the name WS-NAME. WS-ROOT-DIRECTORY must be an absolute path. Register a workspace for bulk operations. All repositories in the directories below &lt;ws-root-directory&gt; get registered under this workspace with the name &lt;ws-name&gt;. &lt;ws-root-directory&gt; must be absolute path.
With option '--from' the URL to a single repository or a file containing multiple URLs can be added and they will be cloned directly into the workspace. Suitable for the initial setup of a multi-repo project. With option '--from' the URL to a single repository or a file containing multiple URLs can be added and they will be cloned directly into the workspace. Suitable for the initial setup of a multi-repo project.
--removeworkspace WS-NAME --removeworkspace &lt;ws-name&gt;
Remove the workspace with the logical name WS-NAME. Remove the workspace with the logical name &lt;ws-name&gt;.
--addcurrent WS-NAME --addcurrent &lt;ws-name&gt;
Adds the current directory as workspace to git bulk operations. The workspace is referenced with its logical name WS-NAME. Adds the current directory as workspace to git bulk operations. The workspace is referenced with its logical name &lt;ws-name&gt;.
git bulk --purge git bulk --purge
@ -68,14 +60,10 @@ git bulk adds convenient support for operations that you want to execute on mult
## EXAMPLES ## EXAMPLES
Register a workspace so that git bulk knows about it using an absolute path: Register a workspace so that git bulk knows about it:
$ git bulk --addworkspace personal ~/workspaces/personal $ git bulk --addworkspace personal ~/workspaces/personal
Or register a workspace using an environment variable pointing to an absolute path:
$ git bulk --addworkspace personal '$PERSONAL_WORKSPACE'
Use option --from in order to directly clone a repository or multiple repositories Use option --from in order to directly clone a repository or multiple repositories
$ git bulk --addworkspace personal ~/workspaces/personal --from https://github.com/tj/git-extras.git $ git bulk --addworkspace personal ~/workspaces/personal --from https://github.com/tj/git-extras.git
@ -116,10 +104,6 @@ git bulk adds convenient support for operations that you want to execute on mult
$ git bulk --purge $ git bulk --purge
## FILES
- `.gitconfig`: Store the `git-bulk` registered workspaces under the `bulkworkspaces` key.
## AUTHOR ## AUTHOR
Written by Niklas Schlimm &lt;<ns103@hotmail.de>&gt; Written by Niklas Schlimm &lt;<ns103@hotmail.de>&gt;

View file

@ -1,52 +1,57 @@
.\" generated with Ronn-NG/v0.9.1 .\" generated with Ronn/v0.7.3
.\" http://github.com/apjanke/ronn-ng/tree/0.9.1 .\" http://github.com/rtomayko/ronn/tree/0.7.3
.TH "GIT\-COMMITS\-SINCE" "1" "January 2026" "" "Git Extras" .
.TH "GIT\-COMMITS\-SINCE" "1" "October 2017" "" "Git Extras"
.
.SH "NAME" .SH "NAME"
\fBgit\-commits\-since\fR \- Show commit logs since some date \fBgit\-commits\-since\fR \- Show commit logs since some date
.
.SH "SYNOPSIS" .SH "SYNOPSIS"
.TS \fBgit\-commits\-since\fR [<date>]
allbox; .
\fBgit\-commits\-since\fR [\-r \-\-ref <ref>] [<date>]
.TE
.SH "DESCRIPTION" .SH "DESCRIPTION"
List of commits since the given \fIdate\fR or \fIref\fR\. List of commits since the given \fIdate\fR\.
.
.SH "OPTIONS" .SH "OPTIONS"
<date> <date>
.
.P .P
Show commits more recent than <date>\. By default, the command shows the commit logs since "last week"\. Show commits more recent than \fIdate\fR\. By default, the command shows the commit logs since "last week"\.
.P .
\-r, \-\-ref <ref>
.P
Show commits since the given ref (tag, branch, or commit)\. When specified, the command uses \fBref\.\.HEAD\fR instead of date\-based filtering\.
.SH "EXAMPLES" .SH "EXAMPLES"
It is really flexible and these are only 3 of the options, go ahead give it a try: It is really flexible and these are only 3 of the options, go ahead give it a try:
.
.IP "" 4 .IP "" 4
.
.nf .nf
$ git commits\-since yesterday $ git commits\-since yesterday
aa084d9 TweeKane \- Add global gitignore to git\-ignore output \.\.\. commits since yesterday
515e94a TJ Holowaychuk \- Merge pull request #128 from nickl\-/git\-extras\-html\-hyperlinks nickl\- \- Merge branch upstream master\.
5f86b54 TJ Holowaychuk \- Merge pull request #129 from nickl\-/develop nickl\- \- Rebase bolshakov with master
7398d10 nickl\- \- Fix #127 git\-ignore won\'t add duplicates\. TJ Holowaychuk \- Merge pull request #128 from nickl\-/git\-extras\-html\-hyperlinks
TJ Holowaychuk \- Merge pull request #129 from nickl\-/develop
nickl\- \- Fix #127 git\-ignore won\'t add duplicates\.
$ git commits\-since 3 o clock pm $ git commits\-since 3 o clock pm
aa084d9 TweeKane \- Add global gitignore to git\-ignore output \.\.\. commits since 3 o clock pm
nickl\- \- Merge branch upstream master\.
$ git commits\-since 2 hour ago $ git commits\-since 2 hour ago
aa084d9 TweeKane \- Add global gitignore to git\-ignore output \.\.\. commits since 2 hour ago
515e94a TJ Holowaychuk \- Merge pull request #128 from nickl\-/git\-extras\-html\-hyperlinks nickl\- \- Merge branch upstream master\.
5f86b54 TJ Holowaychuk \- Merge pull request #129 from nickl\-/develop TJ Holowaychuk \- Merge pull request #128 from nickl\-/git\-extras\-html\-hyperlinks
TJ Holowaychuk \- Merge pull request #129 from nickl\-/develop
$ git commits\-since \-\-ref 7\.4\.0 .
6ed2643 John Bachir \- ability to specify command when hitting enter (#1223)
b9bd309 John Bachir \- Improve `git\-repl` prompt (#1224)
6f4cf0c johnpyp \- feat: `delete\-branch` multiple unique branch names completions (#1221)
\|\.\|\.\|\.
215382b 罗泽轩 \- Bump version to 7\.5\.0\-dev (#1207)
.fi .fi
.
.IP "" 0 .IP "" 0
.
.SH "AUTHOR" .SH "AUTHOR"
Written by Tj Holowaychuk <\fItj@vision\-media\.ca\fR> Written by Tj Holowaychuk <\fItj@vision\-media\.ca\fR>
.
.SH "REPORTING BUGS" .SH "REPORTING BUGS"
<\fIhttps://github\.com/tj/git\-extras/issues\fR> <\fIhttps://github\.com/tj/git\-extras/issues\fR>
.
.SH "SEE ALSO" .SH "SEE ALSO"
<\fIhttps://github\.com/tj/git\-extras\fR> <\fIhttps://github\.com/tj/git\-extras\fR>

View file

@ -1,8 +1,8 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<meta http-equiv='content-type' content='text/html;charset=utf8'> <meta http-equiv='content-type' value='text/html;charset=utf8'>
<meta name='generator' content='Ronn-NG/v0.9.1 (http://github.com/apjanke/ronn-ng/tree/0.9.1)'> <meta name='generator' value='Ronn/v0.7.3 (http://github.com/rtomayko/ronn/tree/0.7.3)'>
<title>git-commits-since(1) - Show commit logs since some date</title> <title>git-commits-since(1) - Show commit logs since some date</title>
<style type='text/css' media='all'> <style type='text/css' media='all'>
/* style: man */ /* style: man */
@ -69,67 +69,51 @@
<li class='tr'>git-commits-since(1)</li> <li class='tr'>git-commits-since(1)</li>
</ol> </ol>
<h2 id="NAME">NAME</h2>
<h2 id="NAME">NAME</h2>
<p class="man-name"> <p class="man-name">
<code>git-commits-since</code> - <span class="man-whatis">Show commit logs since some date</span> <code>git-commits-since</code> - <span class="man-whatis">Show commit logs since some date</span>
</p> </p>
<h2 id="SYNOPSIS">SYNOPSIS</h2> <h2 id="SYNOPSIS">SYNOPSIS</h2>
<table> <p><code>git-commits-since</code> [&lt;date&gt;]</p>
<tbody>
<tr>
<td>
<code>git-commits-since</code> [-r</td>
<td>--ref &lt;ref&gt;] [&lt;date&gt;]</td>
</tr>
</tbody>
</table>
<h2 id="DESCRIPTION">DESCRIPTION</h2> <h2 id="DESCRIPTION">DESCRIPTION</h2>
<p>List of commits since the given <em>date</em> or <em>ref</em>.</p> <p> List of commits since the given <em>date</em>.</p>
<h2 id="OPTIONS">OPTIONS</h2> <h2 id="OPTIONS">OPTIONS</h2>
<p>&lt;date&gt;</p> <p> &lt;date&gt;</p>
<p>Show commits more recent than &lt;date&gt;. By default, the command shows the commit logs since "last week".</p> <p> Show commits more recent than <var>date</var>. By default, the command shows the commit logs since "last week".</p>
<p>-r, --ref &lt;ref&gt;</p>
<p>Show commits since the given ref (tag, branch, or commit). When specified, the command uses <code>ref..HEAD</code> instead of date-based filtering.</p>
<h2 id="EXAMPLES">EXAMPLES</h2> <h2 id="EXAMPLES">EXAMPLES</h2>
<p>It is really flexible and these are only 3 of the options, go ahead give it a try:</p> <p> It is really flexible and these are only 3 of the options, go ahead give it a try:</p>
<pre><code>$ git commits-since yesterday <pre><code>$ git commits-since yesterday
aa084d9 TweeKane - Add global gitignore to git-ignore output ... commits since yesterday
515e94a TJ Holowaychuk - Merge pull request #128 from nickl-/git-extras-html-hyperlinks nickl- - Merge branch upstream master.
5f86b54 TJ Holowaychuk - Merge pull request #129 from nickl-/develop nickl- - Rebase bolshakov with master
7398d10 nickl- - Fix #127 git-ignore won't add duplicates. TJ Holowaychuk - Merge pull request #128 from nickl-/git-extras-html-hyperlinks
TJ Holowaychuk - Merge pull request #129 from nickl-/develop
nickl- - Fix #127 git-ignore won't add duplicates.
$ git commits-since 3 o clock pm $ git commits-since 3 o clock pm
aa084d9 TweeKane - Add global gitignore to git-ignore output ... commits since 3 o clock pm
nickl- - Merge branch upstream master.
$ git commits-since 2 hour ago $ git commits-since 2 hour ago
aa084d9 TweeKane - Add global gitignore to git-ignore output ... commits since 2 hour ago
515e94a TJ Holowaychuk - Merge pull request #128 from nickl-/git-extras-html-hyperlinks nickl- - Merge branch upstream master.
5f86b54 TJ Holowaychuk - Merge pull request #129 from nickl-/develop TJ Holowaychuk - Merge pull request #128 from nickl-/git-extras-html-hyperlinks
TJ Holowaychuk - Merge pull request #129 from nickl-/develop
$ git commits-since --ref 7.4.0
6ed2643 John Bachir - ability to specify command when hitting enter (#1223)
b9bd309 John Bachir - Improve `git-repl` prompt (#1224)
6f4cf0c johnpyp - feat: `delete-branch` multiple unique branch names completions (#1221)
...
215382b 罗泽轩 - Bump version to 7.5.0-dev (#1207)
</code></pre> </code></pre>
<h2 id="AUTHOR">AUTHOR</h2> <h2 id="AUTHOR">AUTHOR</h2>
<p>Written by Tj Holowaychuk &lt;<a href="mailto:tj@vision-media.ca" data-bare-link="true">tj@vision-media.ca</a>&gt;</p> <p>Written by Tj Holowaychuk &lt;<a href="&#x6d;&#x61;&#x69;&#x6c;&#x74;&#x6f;&#x3a;&#116;&#x6a;&#x40;&#x76;&#105;&#x73;&#x69;&#x6f;&#110;&#45;&#109;&#x65;&#x64;&#105;&#x61;&#x2e;&#99;&#97;" data-bare-link="true">&#x74;&#106;&#64;&#x76;&#x69;&#115;&#105;&#111;&#x6e;&#x2d;&#x6d;&#x65;&#x64;&#x69;&#97;&#46;&#x63;&#97;</a>&gt;</p>
<h2 id="REPORTING-BUGS">REPORTING BUGS</h2> <h2 id="REPORTING-BUGS">REPORTING BUGS</h2>
@ -139,9 +123,10 @@ b9bd309 John Bachir - Improve `git-repl` prompt (#1224)
<p>&lt;<a href="https://github.com/tj/git-extras" data-bare-link="true">https://github.com/tj/git-extras</a>&gt;</p> <p>&lt;<a href="https://github.com/tj/git-extras" data-bare-link="true">https://github.com/tj/git-extras</a>&gt;</p>
<ol class='man-decor man-foot man foot'> <ol class='man-decor man-foot man foot'>
<li class='tl'></li> <li class='tl'></li>
<li class='tc'>January 2026</li> <li class='tc'>October 2017</li>
<li class='tr'>git-commits-since(1)</li> <li class='tr'>git-commits-since(1)</li>
</ol> </ol>

View file

@ -3,46 +3,40 @@ git-commits-since(1) -- Show commit logs since some date
## SYNOPSIS ## SYNOPSIS
`git-commits-since` [-r|--ref &lt;ref&gt;] [&lt;date&gt;] `git-commits-since` [&lt;date&gt;]
## DESCRIPTION ## DESCRIPTION
List of commits since the given _date_ or _ref_. List of commits since the given _date_.
## OPTIONS ## OPTIONS
&lt;date&gt; &lt;date&gt;
Show commits more recent than &lt;date&gt;. By default, the command shows the commit logs since "last week". Show commits more recent than <date>. By default, the command shows the commit logs since "last week".
-r, --ref &lt;ref&gt;
Show commits since the given ref (tag, branch, or commit). When specified, the command uses `ref..HEAD` instead of date-based filtering.
## EXAMPLES ## EXAMPLES
It is really flexible and these are only 3 of the options, go ahead give it a try: It is really flexible and these are only 3 of the options, go ahead give it a try:
$ git commits-since yesterday $ git commits-since yesterday
aa084d9 TweeKane - Add global gitignore to git-ignore output ... commits since yesterday
515e94a TJ Holowaychuk - Merge pull request #128 from nickl-/git-extras-html-hyperlinks nickl- - Merge branch upstream master.
5f86b54 TJ Holowaychuk - Merge pull request #129 from nickl-/develop nickl- - Rebase bolshakov with master
7398d10 nickl- - Fix #127 git-ignore won't add duplicates. TJ Holowaychuk - Merge pull request #128 from nickl-/git-extras-html-hyperlinks
TJ Holowaychuk - Merge pull request #129 from nickl-/develop
nickl- - Fix #127 git-ignore won't add duplicates.
$ git commits-since 3 o clock pm $ git commits-since 3 o clock pm
aa084d9 TweeKane - Add global gitignore to git-ignore output ... commits since 3 o clock pm
nickl- - Merge branch upstream master.
$ git commits-since 2 hour ago $ git commits-since 2 hour ago
aa084d9 TweeKane - Add global gitignore to git-ignore output ... commits since 2 hour ago
515e94a TJ Holowaychuk - Merge pull request #128 from nickl-/git-extras-html-hyperlinks nickl- - Merge branch upstream master.
5f86b54 TJ Holowaychuk - Merge pull request #129 from nickl-/develop TJ Holowaychuk - Merge pull request #128 from nickl-/git-extras-html-hyperlinks
TJ Holowaychuk - Merge pull request #129 from nickl-/develop
$ git commits-since --ref 7.4.0
6ed2643 John Bachir - ability to specify command when hitting enter (#1223)
b9bd309 John Bachir - Improve `git-repl` prompt (#1224)
6f4cf0c johnpyp - feat: `delete-branch` multiple unique branch names completions (#1221)
...
215382b 罗泽轩 - Bump version to 7.5.0-dev (#1207)
## AUTHOR ## AUTHOR

View file

@ -1,19 +0,0 @@
.\" generated with Ronn-NG/v0.8.0
.\" http://github.com/apjanke/ronn-ng/tree/0.8.0
.TH "GIT\-CONTINUE" "1" "November 2024" "" "Git Extras"
.SH "NAME"
\fBgit\-continue\fR \- Continue current git operation
.SH "SYNOPSIS"
\fBgit\-continue\fR
.SH "DESCRIPTION"
Continue current git revert, rebase, merge or cherry\-pick process\.
.SH "OPTIONS"
There are no options, it just continues current operation\.
.SH "EXAMPLES"
\fBgit\-continue\fR
.SH "AUTHOR"
Written by oikarinen
.SH "REPORTING BUGS"
<\fI\%https://github\.com/tj/git\-extras/issues\fR>
.SH "SEE ALSO"
<\fI\%https://github\.com/tj/git\-extras\fR>

View file

@ -1,114 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv='content-type' content='text/html;charset=utf8'>
<meta name='generator' content='Ronn-NG/v0.8.0 (http://github.com/apjanke/ronn-ng/tree/0.8.0)'>
<title>git-continue(1) - Continue current git operation</title>
<style type='text/css' media='all'>
/* style: man */
body#manpage {margin:0}
.mp {max-width:100ex;padding:0 9ex 1ex 4ex}
.mp p,.mp pre,.mp ul,.mp ol,.mp dl {margin:0 0 20px 0}
.mp h2 {margin:10px 0 0 0}
.mp > p,.mp > pre,.mp > ul,.mp > ol,.mp > dl {margin-left:8ex}
.mp h3 {margin:0 0 0 4ex}
.mp dt {margin:0;clear:left}
.mp dt.flush {float:left;width:8ex}
.mp dd {margin:0 0 0 9ex}
.mp h1,.mp h2,.mp h3,.mp h4 {clear:left}
.mp pre {margin-bottom:20px}
.mp pre+h2,.mp pre+h3 {margin-top:22px}
.mp h2+pre,.mp h3+pre {margin-top:5px}
.mp img {display:block;margin:auto}
.mp h1.man-title {display:none}
.mp,.mp code,.mp pre,.mp tt,.mp kbd,.mp samp,.mp h3,.mp h4 {font-family:monospace;font-size:14px;line-height:1.42857142857143}
.mp h2 {font-size:16px;line-height:1.25}
.mp h1 {font-size:20px;line-height:2}
.mp {text-align:justify;background:#fff}
.mp,.mp code,.mp pre,.mp pre code,.mp tt,.mp kbd,.mp samp {color:#131211}
.mp h1,.mp h2,.mp h3,.mp h4 {color:#030201}
.mp u {text-decoration:underline}
.mp code,.mp strong,.mp b {font-weight:bold;color:#131211}
.mp em,.mp var {font-style:italic;color:#232221;text-decoration:none}
.mp a,.mp a:link,.mp a:hover,.mp a code,.mp a pre,.mp a tt,.mp a kbd,.mp a samp {color:#0000ff}
.mp b.man-ref {font-weight:normal;color:#434241}
.mp pre {padding:0 4ex}
.mp pre code {font-weight:normal;color:#434241}
.mp h2+pre,h3+pre {padding-left:0}
ol.man-decor,ol.man-decor li {margin:3px 0 10px 0;padding:0;float:left;width:33%;list-style-type:none;text-transform:uppercase;color:#999;letter-spacing:1px}
ol.man-decor {width:100%}
ol.man-decor li.tl {text-align:left}
ol.man-decor li.tc {text-align:center;letter-spacing:4px}
ol.man-decor li.tr {text-align:right;float:right}
</style>
</head>
<!--
The following styles are deprecated and will be removed at some point:
div#man, div#man ol.man, div#man ol.head, div#man ol.man.
The .man-page, .man-decor, .man-head, .man-foot, .man-title, and
.man-navigation should be used instead.
-->
<body id='manpage'>
<div class='mp' id='man'>
<div class='man-navigation' style='display:none'>
<a href="#NAME">NAME</a>
<a href="#SYNOPSIS">SYNOPSIS</a>
<a href="#DESCRIPTION">DESCRIPTION</a>
<a href="#OPTIONS">OPTIONS</a>
<a href="#EXAMPLES">EXAMPLES</a>
<a href="#AUTHOR">AUTHOR</a>
<a href="#REPORTING-BUGS">REPORTING BUGS</a>
<a href="#SEE-ALSO">SEE ALSO</a>
</div>
<ol class='man-decor man-head man head'>
<li class='tl'>git-continue(1)</li>
<li class='tc'>Git Extras</li>
<li class='tr'>git-continue(1)</li>
</ol>
<h2 id="NAME">NAME</h2>
<p class="man-name">
<code>git-continue</code> - <span class="man-whatis">Continue current git operation</span>
</p>
<h2 id="SYNOPSIS">SYNOPSIS</h2>
<p><code>git-continue</code></p>
<h2 id="DESCRIPTION">DESCRIPTION</h2>
<p> Continue current git revert, rebase, merge or cherry-pick process.</p>
<h2 id="OPTIONS">OPTIONS</h2>
<p> There are no options, it just continues current operation.</p>
<h2 id="EXAMPLES">EXAMPLES</h2>
<p> <code>git-continue</code></p>
<h2 id="AUTHOR">AUTHOR</h2>
<p>Written by oikarinen</p>
<h2 id="REPORTING-BUGS">REPORTING BUGS</h2>
<p>&lt;<a href="https://github.com/tj/git-extras/issues" data-bare-link="true">https://github.com/tj/git-extras/issues</a>&gt;</p>
<h2 id="SEE-ALSO">SEE ALSO</h2>
<p>&lt;<a href="https://github.com/tj/git-extras" data-bare-link="true">https://github.com/tj/git-extras</a>&gt;</p>
<ol class='man-decor man-foot man foot'>
<li class='tl'></li>
<li class='tc'>November 2024</li>
<li class='tr'>git-continue(1)</li>
</ol>
</div>
</body>
</html>

View file

@ -1,30 +0,0 @@
git-continue(1) -- Continue current git operation
================================
## SYNOPSIS
`git-continue`
## DESCRIPTION
Continue current git revert, rebase, merge or cherry-pick process.
## OPTIONS
There are no options, it just continues current operation.
## EXAMPLES
`git-continue`
## AUTHOR
Written by oikarinen
## REPORTING BUGS
&lt;<https://github.com/tj/git-extras/issues>&gt;
## SEE ALSO
&lt;<https://github.com/tj/git-extras>&gt;

View file

@ -1,54 +0,0 @@
.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "GIT\-DELETE\-GONE\-BRANCHES" "1" "March 2026" "" "Git Extras"
.
.SH "NAME"
\fBgit\-delete\-gone\-branches\fR \- Delete branches whose remote is gone
.
.SH "SYNOPSIS"
\fBgit\-delete\-gone\-branches\fR [\-n|\-\-dry\-run] [\-f|\-\-force] [\-p|\-\-prune]
.
.SH "DESCRIPTION"
Deletes all local branches whose remote\-tracking branch has been deleted\. This commonly happens after a pull request is merged and the remote branch is removed\. By default, lists the branches and prompts for confirmation before deleting\.
.
.SH "OPTIONS"
\-n, \-\-dry\-run
.
.P
Show the branches that would be deleted without actually deleting them\.
.
.P
\-f, \-\-force
.
.P
Skip the confirmation prompt and delete branches immediately\.
.
.P
\-p, \-\-prune
.
.P
Run \fBgit fetch \-\-prune\fR before checking for gone branches, to ensure remote\-tracking refs are up to date\.
.
.SH "EXAMPLES"
.
.nf
$ git delete\-gone\-branches
$ git delete\-gone\-branches \-\-dry\-run
$ git delete\-gone\-branches \-\-force
$ git delete\-gone\-branches \-\-prune
.
.fi
.
.SH "AUTHOR"
Written by Utsav Sabharwal <\fIhttps://github\.com/codersofthedark\fR>
.
.SH "REPORTING BUGS"
<\fIhttps://github\.com/tj/git\-extras/issues\fR>
.
.SH "SEE ALSO"
<\fIhttps://github\.com/tj/git\-extras\fR>

View file

@ -1,135 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv='content-type' value='text/html;charset=utf8'>
<meta name='generator' value='Ronn/v0.7.3 (http://github.com/rtomayko/ronn/tree/0.7.3)'>
<title>git-delete-gone-branches(1) - Delete branches whose remote is gone</title>
<style type='text/css' media='all'>
/* style: man */
body#manpage {margin:0}
.mp {max-width:100ex;padding:0 9ex 1ex 4ex}
.mp p,.mp pre,.mp ul,.mp ol,.mp dl {margin:0 0 20px 0}
.mp h2 {margin:10px 0 0 0}
.mp > p,.mp > pre,.mp > ul,.mp > ol,.mp > dl {margin-left:8ex}
.mp h3 {margin:0 0 0 4ex}
.mp dt {margin:0;clear:left}
.mp dt.flush {float:left;width:8ex}
.mp dd {margin:0 0 0 9ex}
.mp h1,.mp h2,.mp h3,.mp h4 {clear:left}
.mp pre {margin-bottom:20px}
.mp pre+h2,.mp pre+h3 {margin-top:22px}
.mp h2+pre,.mp h3+pre {margin-top:5px}
.mp img {display:block;margin:auto}
.mp h1.man-title {display:none}
.mp,.mp code,.mp pre,.mp tt,.mp kbd,.mp samp,.mp h3,.mp h4 {font-family:monospace;font-size:14px;line-height:1.42857142857143}
.mp h2 {font-size:16px;line-height:1.25}
.mp h1 {font-size:20px;line-height:2}
.mp {text-align:justify;background:#fff}
.mp,.mp code,.mp pre,.mp pre code,.mp tt,.mp kbd,.mp samp {color:#131211}
.mp h1,.mp h2,.mp h3,.mp h4 {color:#030201}
.mp u {text-decoration:underline}
.mp code,.mp strong,.mp b {font-weight:bold;color:#131211}
.mp em,.mp var {font-style:italic;color:#232221;text-decoration:none}
.mp a,.mp a:link,.mp a:hover,.mp a code,.mp a pre,.mp a tt,.mp a kbd,.mp a samp {color:#0000ff}
.mp b.man-ref {font-weight:normal;color:#434241}
.mp pre {padding:0 4ex}
.mp pre code {font-weight:normal;color:#434241}
.mp h2+pre,h3+pre {padding-left:0}
ol.man-decor,ol.man-decor li {margin:3px 0 10px 0;padding:0;float:left;width:33%;list-style-type:none;text-transform:uppercase;color:#999;letter-spacing:1px}
ol.man-decor {width:100%}
ol.man-decor li.tl {text-align:left}
ol.man-decor li.tc {text-align:center;letter-spacing:4px}
ol.man-decor li.tr {text-align:right;float:right}
</style>
</head>
<!--
The following styles are deprecated and will be removed at some point:
div#man, div#man ol.man, div#man ol.head, div#man ol.man.
The .man-page, .man-decor, .man-head, .man-foot, .man-title, and
.man-navigation should be used instead.
-->
<body id='manpage'>
<div class='mp' id='man'>
<div class='man-navigation' style='display:none'>
<a href="#NAME">NAME</a>
<a href="#SYNOPSIS">SYNOPSIS</a>
<a href="#DESCRIPTION">DESCRIPTION</a>
<a href="#OPTIONS">OPTIONS</a>
<a href="#EXAMPLES">EXAMPLES</a>
<a href="#AUTHOR">AUTHOR</a>
<a href="#REPORTING-BUGS">REPORTING BUGS</a>
<a href="#SEE-ALSO">SEE ALSO</a>
</div>
<ol class='man-decor man-head man head'>
<li class='tl'>git-delete-gone-branches(1)</li>
<li class='tc'>Git Extras</li>
<li class='tr'>git-delete-gone-branches(1)</li>
</ol>
<h2 id="NAME">NAME</h2>
<p class="man-name">
<code>git-delete-gone-branches</code> - <span class="man-whatis">Delete branches whose remote is gone</span>
</p>
<h2 id="SYNOPSIS">SYNOPSIS</h2>
<p><code>git-delete-gone-branches</code> [-n|--dry-run] [-f|--force] [-p|--prune]</p>
<h2 id="DESCRIPTION">DESCRIPTION</h2>
<p> Deletes all local branches whose remote-tracking branch has been deleted.
This commonly happens after a pull request is merged and the remote branch
is removed. By default, lists the branches and prompts for confirmation
before deleting.</p>
<h2 id="OPTIONS">OPTIONS</h2>
<p> -n, --dry-run</p>
<p> Show the branches that would be deleted without actually deleting them.</p>
<p> -f, --force</p>
<p> Skip the confirmation prompt and delete branches immediately.</p>
<p> -p, --prune</p>
<p> Run <code>git fetch --prune</code> before checking for gone branches, to ensure
remote-tracking refs are up to date.</p>
<h2 id="EXAMPLES">EXAMPLES</h2>
<pre><code>$ git delete-gone-branches
$ git delete-gone-branches --dry-run
$ git delete-gone-branches --force
$ git delete-gone-branches --prune
</code></pre>
<h2 id="AUTHOR">AUTHOR</h2>
<p>Written by Utsav Sabharwal &lt;<a href="&#x6d;&#97;&#105;&#x6c;&#x74;&#111;&#x3a;&#117;&#116;&#115;&#97;&#x76;&#x2e;&#115;&#x61;&#x62;&#x68;&#x61;&#x72;&#x77;&#x61;&#108;&#64;&#115;&#x79;&#x73;&#x64;&#105;&#x67;&#x2e;&#99;&#111;&#x6d;" data-bare-link="true">&#117;&#116;&#115;&#x61;&#x76;&#x2e;&#x73;&#x61;&#x62;&#104;&#97;&#x72;&#x77;&#97;&#108;&#64;&#x73;&#121;&#115;&#x64;&#105;&#103;&#46;&#x63;&#x6f;&#109;</a>&gt;</p>
<h2 id="REPORTING-BUGS">REPORTING BUGS</h2>
<p>&lt;<a href="https://github.com/tj/git-extras/issues" data-bare-link="true">https://github.com/tj/git-extras/issues</a>&gt;</p>
<h2 id="SEE-ALSO">SEE ALSO</h2>
<p>&lt;<a href="https://github.com/tj/git-extras" data-bare-link="true">https://github.com/tj/git-extras</a>&gt;</p>
<ol class='man-decor man-foot man foot'>
<li class='tl'></li>
<li class='tc'>March 2026</li>
<li class='tr'>git-delete-gone-branches(1)</li>
</ol>
</div>
</body>
</html>

View file

@ -1,50 +0,0 @@
git-delete-gone-branches(1) -- Delete branches whose remote is gone
====================================================================
## SYNOPSIS
`git-delete-gone-branches` [-n|--dry-run] [-f|--force] [-p|--prune]
## DESCRIPTION
Deletes all local branches whose remote-tracking branch has been deleted.
This commonly happens after a pull request is merged and the remote branch
is removed. By default, lists the branches and prompts for confirmation
before deleting.
## OPTIONS
-n, --dry-run
Show the branches that would be deleted without actually deleting them.
-f, --force
Skip the confirmation prompt and delete branches immediately.
-p, --prune
Run `git fetch --prune` before checking for gone branches, to ensure
remote-tracking refs are up to date.
## EXAMPLES
$ git delete-gone-branches
$ git delete-gone-branches --dry-run
$ git delete-gone-branches --force
$ git delete-gone-branches --prune
## AUTHOR
Written by Utsav Sabharwal &lt;<https://github.com/codersofthedark>&gt;
## REPORTING BUGS
&lt;<https://github.com/tj/git-extras/issues>&gt;
## SEE ALSO
&lt;<https://github.com/tj/git-extras>&gt;

View file

@ -1,19 +1,30 @@
.\" generated with Ronn-NG/v0.10.1 .\" generated with Ronn/v0.7.3
.\" http://github.com/apjanke/ronn-ng/tree/0.10.1 .\" http://github.com/rtomayko/ronn/tree/0.7.3
.TH "GIT\-DELETE\-MERGED\-BRANCHES" "1" "March 2026" "" "Git Extras" .
.TH "GIT\-DELETE\-MERGED\-BRANCHES" "1" "October 2017" "" "Git Extras"
.
.SH "NAME" .SH "NAME"
\fBgit\-delete\-merged\-branches\fR \- Delete merged branches \fBgit\-delete\-merged\-branches\fR \- Delete merged branches
.
.SH "SYNOPSIS" .SH "SYNOPSIS"
\fBgit\-delete\-merged\-branches\fR \fBgit\-delete\-merged\-branches\fR
.
.SH "DESCRIPTION" .SH "DESCRIPTION"
Deletes all branches merged in to current HEAD\. Does not delete the default branch, even if run from a branch that is a descendant of it\. Deletes all branches merged in to current HEAD\. Does not delete \fImaster\fR, even if run from a branch that is a descendant of \fImaster\fR\.
.
.SH "EXAMPLES" .SH "EXAMPLES"
.
.nf .nf
$ git delete\-merged\-branches $ git delete\-merged\-branches
.
.fi .fi
.
.SH "AUTHOR" .SH "AUTHOR"
Written by Jesús Espino <\fIjespinog@gmail\.com\fR> Written by Jesús Espino <\fIjespinog@gmail\.com\fR>
.
.SH "REPORTING BUGS" .SH "REPORTING BUGS"
<\fIhttps://github\.com/tj/git\-extras/issues\fR> <\fIhttps://github\.com/tj/git\-extras/issues\fR>
.
.SH "SEE ALSO" .SH "SEE ALSO"
<\fIhttps://github\.com/tj/git\-extras\fR> <\fIhttps://github\.com/tj/git\-extras\fR>

View file

@ -1,8 +1,8 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<meta http-equiv='content-type' content='text/html;charset=utf-8'> <meta http-equiv='content-type' value='text/html;charset=utf8'>
<meta name='generator' content='Ronn-NG/v0.10.1 (http://github.com/apjanke/ronn-ng/tree/0.10.1)'> <meta name='generator' value='Ronn/v0.7.3 (http://github.com/rtomayko/ronn/tree/0.7.3)'>
<title>git-delete-merged-branches(1) - Delete merged branches</title> <title>git-delete-merged-branches(1) - Delete merged branches</title>
<style type='text/css' media='all'> <style type='text/css' media='all'>
/* style: man */ /* style: man */
@ -68,20 +68,19 @@
<li class='tr'>git-delete-merged-branches(1)</li> <li class='tr'>git-delete-merged-branches(1)</li>
</ol> </ol>
<h2 id="NAME">NAME</h2>
<h2 id="NAME">NAME</h2>
<p class="man-name"> <p class="man-name">
<code>git-delete-merged-branches</code> - <span class="man-whatis">Delete merged branches</span> <code>git-delete-merged-branches</code> - <span class="man-whatis">Delete merged branches</span>
</p> </p>
<h2 id="SYNOPSIS">SYNOPSIS</h2> <h2 id="SYNOPSIS">SYNOPSIS</h2>
<p><code>git-delete-merged-branches</code></p> <p><code>git-delete-merged-branches</code></p>
<h2 id="DESCRIPTION">DESCRIPTION</h2> <h2 id="DESCRIPTION">DESCRIPTION</h2>
<p>Deletes all branches merged in to current HEAD. Does not delete the default branch, even if run from a branch that is <p> Deletes all branches merged in to current HEAD. Does not delete <em>master</em>, even if run from a branch that is
a descendant of it.</p> a descendant of <em>master</em>.</p>
<h2 id="EXAMPLES">EXAMPLES</h2> <h2 id="EXAMPLES">EXAMPLES</h2>
@ -90,7 +89,7 @@
<h2 id="AUTHOR">AUTHOR</h2> <h2 id="AUTHOR">AUTHOR</h2>
<p>Written by Jesús Espino &lt;<a href="mailto:jespinog@gmail.com" data-bare-link="true">jespinog@gmail.com</a>&gt;</p> <p>Written by Jesús Espino &lt;<a href="&#x6d;&#97;&#105;&#108;&#116;&#111;&#58;&#106;&#x65;&#x73;&#x70;&#105;&#110;&#111;&#x67;&#64;&#x67;&#x6d;&#x61;&#x69;&#108;&#x2e;&#x63;&#111;&#109;" data-bare-link="true">&#x6a;&#x65;&#115;&#112;&#105;&#110;&#x6f;&#x67;&#64;&#x67;&#x6d;&#97;&#x69;&#x6c;&#x2e;&#x63;&#111;&#109;</a>&gt;</p>
<h2 id="REPORTING-BUGS">REPORTING BUGS</h2> <h2 id="REPORTING-BUGS">REPORTING BUGS</h2>
@ -100,9 +99,10 @@
<p>&lt;<a href="https://github.com/tj/git-extras" data-bare-link="true">https://github.com/tj/git-extras</a>&gt;</p> <p>&lt;<a href="https://github.com/tj/git-extras" data-bare-link="true">https://github.com/tj/git-extras</a>&gt;</p>
<ol class='man-decor man-foot man foot'> <ol class='man-decor man-foot man foot'>
<li class='tl'></li> <li class='tl'></li>
<li class='tc'>March 2026</li> <li class='tc'>October 2017</li>
<li class='tr'>git-delete-merged-branches(1)</li> <li class='tr'>git-delete-merged-branches(1)</li>
</ol> </ol>

View file

@ -7,8 +7,8 @@ git-delete-merged-branches(1) -- Delete merged branches
## DESCRIPTION ## DESCRIPTION
Deletes all branches merged in to current HEAD. Does not delete the default branch, even if run from a branch that is Deletes all branches merged in to current HEAD. Does not delete *master*, even if run from a branch that is
a descendant of it. a descendant of *master*.
## EXAMPLES ## EXAMPLES

View file

@ -1,24 +1,18 @@
.\" generated with Ronn/v0.7.3 .\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3
. .
.TH "GIT\-DELETE\-SQUASHED\-BRANCHES" "1" "February 2024" "" "Git Extras" .TH "GIT\-DELETE\-SQUASHED\-BRANCHES" "1" "May 2021" "" "Git Extras"
. .
.SH "NAME" .SH "NAME"
\fBgit\-delete\-squashed\-branches\fR \- Delete branches that were squashed \fBgit\-delete\-squashed\-branches\fR \- Delete branches that were squashed
. .
.SH "SYNOPSIS" .SH "SYNOPSIS"
\fBgit\-delete\-squashed\-branches\fR [\-\-proceed, \-p] [<branch\-name>] \fBgit\-delete\-squashed\-branches\fR [<branch\-name>]
. .
.SH "DESCRIPTION" .SH "DESCRIPTION"
Deletes all git branches that have been "squash\-merged" into \fBbranch\-name\fR\. Deletes all git branches that have been "squash\-merged" into \fBbranch\-name\fR\.
. .
.SH "OPTIONS" .SH "OPTIONS"
\-\-proceed, \-p
.
.P
Proceed with the next branch even if the current branch cannot be deleted (e\.g\. because it is checked out in a worktree)
.
.P
<branch\-name> <branch\-name>
. .
.P .P

View file

@ -76,7 +76,7 @@
<h2 id="SYNOPSIS">SYNOPSIS</h2> <h2 id="SYNOPSIS">SYNOPSIS</h2>
<p><code>git-delete-squashed-branches</code> [--proceed, -p] [&lt;branch-name&gt;]</p> <p><code>git-delete-squashed-branches</code> [&lt;branch-name&gt;]</p>
<h2 id="DESCRIPTION">DESCRIPTION</h2> <h2 id="DESCRIPTION">DESCRIPTION</h2>
@ -84,10 +84,6 @@
<h2 id="OPTIONS">OPTIONS</h2> <h2 id="OPTIONS">OPTIONS</h2>
<p> --proceed, -p</p>
<p> Proceed with the next branch even if the current branch cannot be deleted (e.g. because it is checked out in a worktree)</p>
<p> &lt;branch-name&gt;</p> <p> &lt;branch-name&gt;</p>
<p> The target branch were the "squashed-merged" branches were committed to. If no value is given, then the current checked out branch will be used.</p> <p> The target branch were the "squashed-merged" branches were committed to. If no value is given, then the current checked out branch will be used.</p>
@ -106,7 +102,7 @@
<h2 id="AUTHOR">AUTHOR</h2> <h2 id="AUTHOR">AUTHOR</h2>
<p>Written by Teddy Katz &lt;<a href="&#109;&#97;&#105;&#108;&#x74;&#111;&#58;&#116;&#101;&#100;&#x64;&#x79;&#46;&#x6b;&#97;&#x74;&#122;&#64;&#103;&#109;&#97;&#x69;&#108;&#46;&#99;&#x6f;&#x6d;" data-bare-link="true">&#116;&#x65;&#x64;&#x64;&#x79;&#x2e;&#x6b;&#97;&#116;&#122;&#64;&#103;&#109;&#x61;&#105;&#x6c;&#x2e;&#x63;&#x6f;&#109;</a>&gt; and Vladimir Jimenez &lt;<a href="&#x6d;&#x61;&#105;&#x6c;&#x74;&#x6f;&#58;&#x6d;&#x65;&#x40;&#x61;&#x6c;&#108;&#101;&#106;&#111;&#46;&#105;&#111;" data-bare-link="true">&#109;&#101;&#64;&#x61;&#108;&#x6c;&#x65;&#106;&#111;&#46;&#x69;&#111;</a>&gt;</p> <p>Written by Teddy Katz &lt;<a href="&#109;&#97;&#x69;&#108;&#x74;&#x6f;&#58;&#116;&#x65;&#x64;&#x64;&#121;&#46;&#x6b;&#97;&#116;&#122;&#64;&#103;&#109;&#x61;&#105;&#108;&#46;&#99;&#x6f;&#x6d;" data-bare-link="true">&#x74;&#101;&#x64;&#100;&#x79;&#46;&#x6b;&#x61;&#x74;&#x7a;&#x40;&#x67;&#109;&#97;&#105;&#108;&#46;&#x63;&#111;&#109;</a>&gt; and Vladimir Jimenez &lt;<a href="&#x6d;&#97;&#x69;&#108;&#116;&#x6f;&#58;&#109;&#x65;&#x40;&#97;&#108;&#x6c;&#x65;&#x6a;&#111;&#x2e;&#105;&#x6f;" data-bare-link="true">&#109;&#x65;&#64;&#x61;&#x6c;&#108;&#x65;&#106;&#x6f;&#46;&#105;&#x6f;</a>&gt;</p>
<h2 id="REPORTING-BUGS">REPORTING BUGS</h2> <h2 id="REPORTING-BUGS">REPORTING BUGS</h2>
@ -119,7 +115,7 @@
<ol class='man-decor man-foot man foot'> <ol class='man-decor man-foot man foot'>
<li class='tl'></li> <li class='tl'></li>
<li class='tc'>February 2024</li> <li class='tc'>May 2021</li>
<li class='tr'>git-delete-squashed-branches(1)</li> <li class='tr'>git-delete-squashed-branches(1)</li>
</ol> </ol>

Some files were not shown because too many files have changed in this diff Show more