My collection of small binary utilities
This repository was created from my dotfiles repository. I've collected (and wrote some myself) along almost 10 years. If you know the author of some uncredited bin, please, let me know (or open a pull-request) and I'll update it accordingly. :)
Disclaimer: I mainly use ZSH, so some scripts here might not work as well (or not work at all) in other shell like bash or fish. Feel free to open a pull-request to make these scripts more portable.
Clone this somewhere in your system, for example $HOME/.bin-filipekiss
$ git clone https://github.com/filipekiss/bin ~/.bin-filipekiss
Then, edit your PATH
variable to add the folder above to it. (If you have no
idea where that is, it's probably in a file called .zshrc
or .bashrc
that
sits in your home folder)
export PATH=$HOME/.bin-filipekiss:$PATH
Restart your terminal and the commands should be available.
If you ever copied a command from the internet (like the git clone
above) and
got an error saying $: command not found
, this is the script for you. It
reminds you to stop copy pasting commands from the internet (because that's a
security issue, you know) but also runs the command so you don't get frustrated
Shortcut to chmod +x
, to easily give execute permission to files
This is a small utility I wrote to help me debug some scripts (specially completion scripts, since it's hard to output information). It's a very crude logging mechanism.
At the beginning of your script, call __debug start
. You may pass an optional
file name where the messages will be written, for example
__debug start myscript.log
. Be aware that the myscript.log
file will be
truncated.
During your script, when you need to debug something, just call
__debug "Debugging message"
and a message will be appended to the debug file,
with a time stamp.
You can use __debug tail
to tail the latest debug file (or you can tail -f
the file directly)
Print a color table showing all terminal colors supported.
USAGE: dst [TIMEZONE]
Check daylight savings for a given timezone. Timezone must be in tz database format. You can check the complete list here
Use to extract compressed files: extract archive.zip
.
Supported extensions: *.tar.bz2
, *.tar.gz
, *.bz2
, *.rar
, *.gz
,
*.tar
, *.tbz2
, *.tgz
, *.zip
, *.Z
, *.7z
A word about
git-
binariesAll utilities that are prefixed with
git-
can be used as git commands. so instead of using the command asgit-browse
you cangit browse
and have the same effect.
USAGE: git ahead [branch]
Show which commits will be pushed to the current tracked branch. If you pass a branch, compare against that branch instead
Flags | Description |
---|---|
--submodules | Include submodules when checking |
--force | Force fetching changes from the remote |
git-ahead
accepts any argument you're able to pass to git log
USAGE: git behind [branch]
Show which commits will be pulled from the current tracked branch. If you pass a branch, compare against that branch instead
Flags | Description |
---|---|
--submodules | Include submodules when checking |
--force | Force fetching changes from the remote |
git-behind
accepts any argument you're able to pass to git log
USAGE: git browse
use this to open the current project in your browser. this will parse the
default remote (usually origin
) to choose which url to open. if you have
multiple remotes, you can pass an options argument with the remote name, for
example git browse gitlab
.
If you have
hub
installed, it already provides abrowse
command to git and it will take precedence over this.
USAGE: git churn
Churn means "frequency of change". You'll get an output like this:
$ git churn
1 file1
22 file2
333 file3
This means that file1
changed one time, file2
changes 22 times, and file3
changes 333 times.
Show churn for whole repo: $ git churn
Show churn for specific directories: $ git churn app lib
Show churn for a time range: $ git churn --since='1 month ago'
git-churn
accepts any argument you're able to pass to git log
USAGE: git conflicts
Show all files that are in a conflicted state.
USAGE: git credit "Zach Holman" [email protected]
Use this to credit the previous commit to another author
USAGE: git deinit
Remove all git
related files. It's the opposite of git init
.
THIS COMMAND IS NOT REVERSIBLE. YOU WILL LOOSE ALL HISTORY.
USAGE: git delete-tags
Remove all tags locally and remotely. Requires awk
USAGE: git delete-merged-branches
Check which branches are already merged into you main branch and delete them.
Flags | Description |
---|---|
--remote | Run against remote branches. Default is running on local |
--delete | Delete the merged branches. If you don't pass this option, it will only list the branches that would be deleted |
--default-branch [main] | Use this to pass the name of the default branch, in case your repository uses a different name than main. |
--origin [origin] | Set the name of the remote to run against. Defaults to origin |
--force-delete | Force deletion of branches. You shouldn't need this option, ever |
--allow [branch-name] | If this option is given, only branches that match the given names we'll be deleted. It can be passed multiple times. * wildcard is supported |
--deny [branch-name] | If this option is given, only branches that DO NOT match the given names we'll be deleted. It can be passed multiple times. * wildcard is supported. |
--squashed | Also check for branches that were merged to master using the squash strategy |
--squashed-only | Check only for branches that we're merged using the squash strategy |
--no-squash-warning | Suppress the output information when squashed branches are found but no --squashed option was passed |
Argument | Description |
---|---|
branch name | The only argument this command accepts is the branch name to compare other branches against. Defaults to origin/master (or whatever remote you pass using the --origin option) |
USAGE: git edit [conflicts|commited|staged|edited]
Use this to edit file in various states. Uses $EDITOR
to decide which editor
to use. If no filter is passed, uses edited
by default
git edit conflicts
Open all files that are in a conflicted state
git edit commited
Open all files that were changed on the last commit
git edit staged
Open all files that are staged for commit since last
commit
git edit edited
Open all files that were edited but not staged since
last commit - this is the same as git edit
USAGE: git flush
Use this to reduce the size of your repository. It deletes all reflogs, stashes and other stuff that may be bloating your repository.
Requires perl
USAGE: git-go [OPTION] [COMMAND]
Flags | Description |
---|---|
-g |
Perform command globally, not scoped to current git repository |
Command | Description |
---|---|
search "q" | Perform a search |
@user | Browse a user. Is you pass @user/repository, browse that repo instead |
explore | Explore GitHub |
my [SUBCOMMAND] | Browse your personal items, where SUBCOMMAND is one of:
|
USAGE: git health [all|local|remote] --stale --markdown
By default, git health will be run against local branches. You can pass local to only check local branches and remote to only check remote branches and all to check all branches.
The branches will be sorted by last activity, from the most recently active to
the least recent active. You can use a dash prefix to invert the order, so
git health -all
will list all branches with the most stale branch on top and
the most recent active branch on the bottom
If you pass the --stale
option, only stale branches will be listed. By
default, branches are considered stale if no commit was made to them in the past
3 months. You can pass a value to stale, so --stale "15 days ago"
will list
branches with no commits in the last 15 days.
If you pass the --markdown
option, the output will be a markdown table, so you
can do something like git health --markdown > stale_branches.md
to easily have
a markdown file generated with the stale branches.
USAGE: git ignore [OPTIONS] [patterns]
Add files to .gitignore
or .git/info/exclude
. If adding to
.git/info/exclude
, the file will be ignored for the current clone only. This
is not commited.
Flags | Description |
---|---|
--exclude, -e | Use .git/info/exclude instead of adding to .gitignore |
--root, -R | Add to the .gitignore file in the root of the project. |
USAGE: git maxpack
Set git compression to the maximum level and repack the current repository
USAGE: git nuke an-old-branch
Deletes a branch both locally and on the origin remote
USAGE: git purge-file file1 file2
This will remove all paths from the current git repository and history. See this help article from GitHub for more info.
USAGE: git-rel [<ref>]
Shows the relationship between the current branch
and . With no , the current branch's remote tracking branch is used.
Examples:
$ git-rel
15 ahead
11 behind
$ git-rel v1.1
230 ahead
USAGE: git rewrite-to-subfolder
This script rewrites your entire history, moving the current repository root into a subdirectory. This can be useful if you want to merge a submodule into its parent repository.
For example, your main repository might contain a submodule at the path
src/lib/
, containing a file called test.c
. If you would merge the submodule
into the parent repository without further modification, all the commits to
test.c
will have the path /test.c
, whereas the file now actually lives in
src/lib/test.c
.
If you rewrite your history using this script, adding src/lib/
to the path and
the merging into the parent repository, all paths will be correct.
NOTE: This script might complete garble your repository, so PLEASE apply this only to a clone of the repository where it does not matter if the repo is destroyed.
USAGE: git shamend [options] [<revision>]
Amends your staged changes as a fixup (keeping the pre-existing commit message) to the specified commit, or HEAD if no revision is specified.
Flags | Description |
---|---|
-a, --all | Commit unchanged files, same as git commit. |
USAGE: git st
A better git status, that shows a short summary and the diff stat.
Taken from this reddit thread
USAGE: git store [description]
after git add files-to-stash
This script is based on
this stackoverflow answer. It basically
creates two stashes: One named "Stashed: ", which includes
everything. This is git default stash. A second one named "Stored:
". This will include only the staged changes. By default, the first
stash created is deleted, leaving you only with the stash with the staged
changes. See the store.preserve
option below for more info.
store.preserve = [true|false]
By default, git-store
will not preserve
the unstaged changes. Since we use the double stash method, it will delete the
"bad" stash and keep only the "good" stash (the one with only the staged
changes). You can keep the "bad" stash by setting the store.preserve
config to
true:
git config [--global] store.preserve true
USAGE: git sync [origin] [branch]
Syncs the current branch with it's remote counterpart. Basically a shortcut to
git pull --rebase && git push
If you have
hub
installed, it already provides async
command to git and it will take precedence over this.
USAGE: git-up
Like git-pull
but show a short and sexy log of changes
USAGE: git what-the-hell-just-happened [branch]
Show what was changed between the last two commits (HEAD
and HEAD@{1}
).
USAGE: git winner [date] --detail
Show who has the most commits (number of commits and number of commited lines)
after a given date. If --detail
is passed, all messages for the commits
analyzed will be printed.
USAGE: git wtf [branch+] [options]
git-wtf
displays the state of your repository in a readable, easy-to-scan
format. It's useful for getting a summary of how a branch relates to a remote
server, and for wrangling many topic branches.
git-wtf
can show you:
- How a branch relates to the remote repo, if it's a tracking branch.
- How a branch relates to integration branches, if it's a feature branch.
- How a branch relates to the feature branches, if it's an integration branch.
git-wtf
is best used before a git push, or between a git fetch and a git
merge. Be sure to set color.ui to auto or yes for maximum viewing pleasure.
If [branch] is not specified, git-wtf
will use the current branch. The
possible [options] are:
Options | Description |
---|---|
-l, --long | include author info and date for each commit |
-a, --all | show all branches across all remote repos, not just those from origin |
-A, --all-commits | show all commits, not just the first 5 |
-s, --short | don't show commits |
-k, --key | show key |
-r, --relations | show relation to features / integration branches |
--dump-config | print out current configuration and exit |
git-wtf
uses some heuristics to determine which branches are integration
branches, and which are feature branches. (Specifically, it assumes the
integration branches are named "master", "next" and "edge".) If it guesses
incorrectly, you will have to create a .git-wtfrc
file.
To start building a configuration file, run git-wtf --dump-config > .git-wtfrc
and edit it. The config file is a YAML file that specifies the integration
branches, any branches to ignore, and the max number of commits to display when
--all-commits
isn't used. git-wtf
will look for a .git-wtfrc
file starting
in the current directory, and recursively up to the root.
IMPORTANT NOTE: all local branches referenced in .git-wtfrc
must be prefixed
with heads/
, e.g. heads/master
. Remote branches must be of the form
remotes/<remote>/<branch>
.
USAGE: killport [PORT]
Kill all processes running on the specified port.
USAGE: macos-wify [no-symbol]
I used this to show the current wi-fi connection name in my TMUX status bar. If
you pass no-symbol
as the argument, only the SSID of the connection will be
returned. Otherwise, the format ₩:<SSID>
wil be used
USAGE: network-status [options]
An improved version of the macos-wifi
binary. It works as a general tool to
test internet availability. If you are connected to a Wi-Fi network, a Wi-Fi
symbol and the network name will be displayed. If you're using a cabled
connection, a little ethernet cable will be used to display the network status.
The script works under Linux as well, but it won't show the network name. Also note that, for the symbols to show properly, you need to use a font that has been patched with Nerd Font
Flags | Description |
---|---|
--no-color | Don't show colored output |
--tmux | Use TMUX formatting instead of terminal colors |
USAGE: test-drive
Display the current terminal capabilities, including 24-bit color, left-to-right chars, sixel images, emoji etc…
I'd like to thank everyone who posts their scripts online so people like me are able to read and learn from them. This is a small way of giving back to the community.
filipekiss/bin © 2019+, Filipe Kiss Released under the MIT License.
Authored and maintained by Filipe Kiss.
GitHub @filipekiss · Twitter @filipekiss