2 # bash completion support for core Git.
4 # Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
5 # Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
6 # Distributed under the GNU General Public License, version 2.0.
8 # The contained completion routines provide support for completing:
10 # *) local and remote branch names
11 # *) local and remote tag names
12 # *) .git/remotes file names
13 # *) git 'subcommands'
14 # *) tree paths within 'ref:path/to/file' expressions
15 # *) common --long-options
17 # To use these routines:
19 # 1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
20 # 2) Added the following line to your .bashrc:
21 # source ~/.git-completion.sh
23 # 3) You may want to make sure the git executable is available
24 # in your PATH before this script is sourced, as some caching
25 # is performed while the script loads. If git isn't found
26 # at source time then all lookups will be done on demand,
27 # which may be slightly slower.
29 # 4) Consider changing your PS1 to also show the current branch:
30 # PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
32 # The argument to __git_ps1 will be displayed only if you
33 # are currently in a git repository. The %s token will be
34 # the name of the current branch.
38 # *) Read Documentation/SubmittingPatches
39 # *) Send all patches to the current maintainer:
41 # "Shawn O. Pearce" <spearce@spearce.org>
43 # *) Always CC the Git mailing list:
51 if [ -n "$__git_dir" ]; then
53 elif [ -d .git
]; then
56 git rev-parse
--git-dir 2>/dev
/null
58 elif [ -d "$1/.git" ]; then
67 local b
="$(git symbolic-ref HEAD 2>/dev/null)"
70 printf "$1" "${b##refs/heads/}"
72 printf " (%s)" "${b##refs/heads/}"
79 local all c s
=$
'\n' IFS
=' '$
'\t'$
'\n'
80 local cur
="${COMP_WORDS[COMP_CWORD]}"
86 --*=*) all
="$all$c$4$s" ;;
87 *.
) all
="$all$c$4$s" ;;
88 *) all
="$all$c$4 $s" ;;
92 COMPREPLY
=($
(compgen
-P "$2" -W "$all" -- "$cur"))
98 local cmd i is_hash
=y dir
="$(__gitdir "$1")"
99 if [ -d "$dir" ]; then
100 for i
in $
(git
--git-dir="$dir" \
101 for-each-ref
--format='%(refname)' \
103 echo "${i#refs/heads/}"
107 for i
in $
(git-ls-remote
"$1" 2>/dev
/null
); do
108 case "$is_hash,$i" in
111 n
,refs
/heads
/*) is_hash
=y
; echo "${i#refs/heads/}" ;;
112 n
,*) is_hash
=y
; echo "$i" ;;
119 local cmd i is_hash
=y dir
="$(__gitdir "$1")"
120 if [ -d "$dir" ]; then
121 for i
in $
(git
--git-dir="$dir" \
122 for-each-ref
--format='%(refname)' \
124 echo "${i#refs/tags/}"
128 for i
in $
(git-ls-remote
"$1" 2>/dev
/null
); do
129 case "$is_hash,$i" in
132 n
,refs
/tags
/*) is_hash
=y
; echo "${i#refs/tags/}" ;;
133 n
,*) is_hash
=y
; echo "$i" ;;
140 local cmd i is_hash
=y dir
="$(__gitdir "$1")"
141 if [ -d "$dir" ]; then
142 if [ -e "$dir/HEAD" ]; then echo HEAD
; fi
143 for i
in $
(git
--git-dir="$dir" \
144 for-each-ref
--format='%(refname)' \
145 refs
/tags refs
/heads refs
/remotes
); do
147 refs
/tags
/*) echo "${i#refs/tags/}" ;;
148 refs
/heads
/*) echo "${i#refs/heads/}" ;;
149 refs
/remotes
/*) echo "${i#refs/remotes/}" ;;
155 for i
in $
(git-ls-remote
"$dir" 2>/dev
/null
); do
156 case "$is_hash,$i" in
159 n
,refs
/tags
/*) is_hash
=y
; echo "${i#refs/tags/}" ;;
160 n
,refs
/heads
/*) is_hash
=y
; echo "${i#refs/heads/}" ;;
161 n
,refs
/remotes
/*) is_hash
=y
; echo "${i#refs/remotes/}" ;;
162 n
,*) is_hash
=y
; echo "$i" ;;
170 for i
in $
(__git_refs
"$1"); do
175 __git_refs_remotes
()
177 local cmd i is_hash
=y
178 for i
in $
(git-ls-remote
"$1" 2>/dev
/null
); do
179 case "$is_hash,$i" in
182 echo "$i:refs/remotes/$1/${i#refs/heads/}"
186 n
,refs
/tags
/*) is_hash
=y
;;
194 local i ngoff IFS
=$
'\n' d
="$(__gitdir)"
195 shopt -q nullglob || ngoff
=1
197 for i
in "$d/remotes"/*; do
198 echo ${i#$d/remotes/}
200 [ "$ngoff" ] && shopt -u nullglob
201 for i
in $
(git
--git-dir="$d" config
--list); do
211 __git_merge_strategies
()
213 if [ -n "$__git_merge_strategylist" ]; then
214 echo "$__git_merge_strategylist"
217 sed -n "/^all_strategies='/{
218 s/^all_strategies='//
222 }" "$(git --exec-path)/git-merge"
224 __git_merge_strategylist
=
225 __git_merge_strategylist
="$(__git_merge_strategies 2>/dev/null)"
227 __git_complete_file
()
229 local pfx
ls ref cur
="${COMP_WORDS[COMP_CWORD]}"
245 COMPREPLY
=($
(compgen
-P "$pfx" \
246 -W "$(git --git-dir="$
(__gitdir
)" ls-tree "$ls" \
247 | sed '/^100... blob /s,^.* ,,
256 __gitcomp
"$(__git_refs)"
261 __git_complete_revlist
()
263 local pfx cur
="${COMP_WORDS[COMP_CWORD]}"
268 __gitcomp
"$(__git_refs)" "$pfx" "$cur"
273 __gitcomp
"$(__git_refs)" "$pfx" "$cur"
279 __gitcomp
"$(__git_refs)"
286 if [ -n "$__git_commandlist" ]; then
287 echo "$__git_commandlist"
291 for i
in $
(git
help -a|
egrep '^ ')
294 add--interactive
) : plumbing
;;
295 applymbox
) : ask gittus
;;
296 applypatch
) : ask gittus
;;
297 archimport
) : import
;;
298 cat-file
) : plumbing
;;
299 check-attr
) : plumbing
;;
300 check-ref-format
) : plumbing
;;
301 commit-tree
) : plumbing
;;
302 cvsexportcommit
) : export;;
303 cvsimport
) : import
;;
304 cvsserver
) : daemon
;;
306 diff-files
) : plumbing
;;
307 diff-index
) : plumbing
;;
308 diff-tree
) : plumbing
;;
309 fast-import
) : import
;;
310 fsck-objects
) : plumbing
;;
311 fetch--tool
) : plumbing
;;
312 fetch-pack
) : plumbing
;;
313 fmt-merge-msg
) : plumbing
;;
314 for-each-ref
) : plumbing
;;
315 hash-object
) : plumbing
;;
316 http-
*) : transport
;;
317 index-pack
) : plumbing
;;
318 init-db
) : deprecated
;;
319 local-fetch
) : plumbing
;;
320 mailinfo
) : plumbing
;;
321 mailsplit
) : plumbing
;;
322 merge-
*) : plumbing
;;
325 pack-objects
) : plumbing
;;
326 pack-redundant
) : plumbing
;;
327 pack-refs
) : plumbing
;;
328 parse-remote
) : plumbing
;;
329 patch-id
) : plumbing
;;
330 peek-remote
) : plumbing
;;
332 prune-packed
) : plumbing
;;
333 quiltimport
) : import
;;
334 read-tree
) : plumbing
;;
335 receive-pack
) : plumbing
;;
337 repo-config
) : plumbing
;;
339 rev-list
) : plumbing
;;
340 rev-parse
) : plumbing
;;
341 runstatus
) : plumbing
;;
342 sh-setup
) : internal
;;
344 send-pack
) : plumbing
;;
345 show-index
) : plumbing
;;
347 stripspace
) : plumbing
;;
348 svn
) : import
export;;
349 svnimport
) : import
;;
350 symbolic-ref
) : plumbing
;;
351 tar-tree
) : deprecated
;;
352 unpack-file
) : plumbing
;;
353 unpack-objects
) : plumbing
;;
354 update-index
) : plumbing
;;
355 update-ref
) : plumbing
;;
356 update-server-info
) : daemon
;;
357 upload-archive
) : plumbing
;;
358 upload-pack
) : plumbing
;;
359 write-tree
) : plumbing
;;
360 verify-tag
) : plumbing
;;
366 __git_commandlist
="$(__git_commands 2>/dev/null)"
371 for i
in $
(git
--git-dir="$(__gitdir)" config
--list); do
381 __git_aliased_command
()
383 local word cmdline
=$
(git
--git-dir="$(__gitdir)" \
384 config
--get "alias.$1")
385 for word
in $cmdline; do
386 if [ "${word##-*}" ]; then
393 __git_whitespacelist
="nowarn warn error error-all strip"
397 local cur
="${COMP_WORDS[COMP_CWORD]}"
398 if [ -d .dotest
]; then
399 __gitcomp
"--skip --resolved"
404 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
409 --signoff --utf8 --binary --3way --interactive
419 local cur
="${COMP_WORDS[COMP_CWORD]}"
422 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
427 --stat --numstat --summary --check --index
428 --cached --index-info --reverse --reject --unidiff-zero
429 --apply --no-add --exclude=
430 --whitespace= --inaccurate-eof --verbose
439 local cur
="${COMP_WORDS[COMP_CWORD]}"
442 __gitcomp
"--interactive --refresh"
451 while [ $c -lt $COMP_CWORD ]; do
454 start|bad|good|
reset|visualize|replay|log
)
462 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
463 __gitcomp
"start bad good reset visualize replay log"
469 __gitcomp
"$(__git_refs)"
479 __gitcomp
"$(__git_refs)"
484 local mycword
="$COMP_CWORD"
485 case "${COMP_WORDS[0]}" in
487 local cmd
="${COMP_WORDS[2]}"
488 mycword
="$((mycword-1))"
491 local cmd
="${COMP_WORDS[1]}"
496 __gitcomp
"create list-heads verify unbundle"
504 __git_complete_revlist
513 __gitcomp
"$(__git_refs)"
518 __gitcomp
"$(__git_refs)"
523 local cur
="${COMP_WORDS[COMP_CWORD]}"
526 __gitcomp
"--edit --no-commit"
529 __gitcomp
"$(__git_refs)"
536 local cur
="${COMP_WORDS[COMP_CWORD]}"
540 --all --author= --signoff --verify --no-verify
541 --edit --amend --include --only
550 __gitcomp
"$(__git_refs)"
560 __gitcomp
"$(__git_refs)"
565 local cur
="${COMP_WORDS[COMP_CWORD]}"
567 case "${COMP_WORDS[0]},$COMP_CWORD" in
569 __gitcomp
"$(__git_remotes)"
572 __gitcomp
"$(__git_remotes)"
577 __gitcomp
"$(__git_refs)" "" "${cur#*:}"
581 case "${COMP_WORDS[0]}" in
582 git-fetch
) remote
="${COMP_WORDS[1]}" ;;
583 git
) remote
="${COMP_WORDS[2]}" ;;
585 __gitcomp
"$(__git_refs2 "$remote")"
594 local cur
="${COMP_WORDS[COMP_CWORD]}"
598 --stdout --attach --thread
600 --numbered --start-number
605 --full-index --binary
611 __git_complete_revlist
616 local cur
="${COMP_WORDS[COMP_CWORD]}"
619 __gitcomp
"--prune --aggressive"
628 __gitcomp
"$(__git_remotes)"
638 local cur
="${COMP_WORDS[COMP_CWORD]}"
642 oneline short medium full fuller email raw
643 " "" "${cur##--pretty=}"
648 relative iso8601 rfc2822 short local default
649 " "" "${cur##--date=}"
654 --max-count= --max-age= --since= --after=
655 --min-age= --before= --until=
656 --root --topo-order --date-order --reverse
658 --abbrev-commit --abbrev=
659 --relative-date --date=
660 --author= --committer= --grep=
662 --pretty= --name-status --name-only --raw
664 --left-right --cherry-pick
669 __git_complete_revlist
674 local cur
="${COMP_WORDS[COMP_CWORD]}"
675 case "${COMP_WORDS[COMP_CWORD-1]}" in
677 __gitcomp
"$(__git_merge_strategies)"
682 __gitcomp
"$(__git_merge_strategies)" "" "${cur##--strategy=}"
687 --no-commit --no-summary --squash --strategy
691 __gitcomp
"$(__git_refs)"
696 __gitcomp
"$(__git_refs)"
701 __gitcomp
"--tags --all --stdin"
706 local cur
="${COMP_WORDS[COMP_CWORD]}"
708 case "${COMP_WORDS[0]},$COMP_CWORD" in
710 __gitcomp
"$(__git_remotes)"
713 __gitcomp
"$(__git_remotes)"
717 case "${COMP_WORDS[0]}" in
718 git-pull
) remote
="${COMP_WORDS[1]}" ;;
719 git
) remote
="${COMP_WORDS[2]}" ;;
721 __gitcomp
"$(__git_refs "$remote")"
728 local cur
="${COMP_WORDS[COMP_CWORD]}"
730 case "${COMP_WORDS[0]},$COMP_CWORD" in
732 __gitcomp
"$(__git_remotes)"
735 __gitcomp
"$(__git_remotes)"
741 case "${COMP_WORDS[0]}" in
742 git-push
) remote
="${COMP_WORDS[1]}" ;;
743 git
) remote
="${COMP_WORDS[2]}" ;;
745 __gitcomp
"$(__git_refs "$remote")" "" "${cur#*:}"
748 __gitcomp
"$(__git_refs)" + "${cur#+}"
751 __gitcomp
"$(__git_refs)"
760 local cur
="${COMP_WORDS[COMP_CWORD]}"
761 if [ -d .dotest
] ||
[ -d .git
/.dotest-merge
]; then
762 __gitcomp
"--continue --skip --abort"
765 case "${COMP_WORDS[COMP_CWORD-1]}" in
767 __gitcomp
"$(__git_merge_strategies)"
772 __gitcomp
"$(__git_merge_strategies)" "" "${cur##--strategy=}"
776 __gitcomp
"--onto --merge --strategy"
779 __gitcomp
"$(__git_refs)"
784 local cur
="${COMP_WORDS[COMP_CWORD]}"
785 local prv
="${COMP_WORDS[COMP_CWORD-1]}"
788 __gitcomp
"$(__git_remotes)"
792 __gitcomp
"$(__git_refs)"
796 local remote
="${prv#remote.}"
797 remote
="${remote%.fetch}"
798 __gitcomp
"$(__git_refs_remotes "$remote")"
802 local remote
="${prv#remote.}"
803 remote
="${remote%.push}"
804 __gitcomp
"$(git --git-dir="$
(__gitdir
)" \
805 for-each-ref --format='%(refname):%(refname)' \
809 pull.twohead|pull.octopus
)
810 __gitcomp
"$(__git_merge_strategies)"
813 color.branch|color.
diff|color.status
)
814 __gitcomp
"always never auto"
819 black red green yellow blue magenta cyan white
820 bold dim ul blink reverse
832 --global --system --file=
834 --get --get-all --get-regexp
835 --add --unset --unset-all
836 --remove-section --rename-section
841 local pfx
="${cur%.*}."
843 __gitcomp
"remote merge" "$pfx" "$cur"
847 local pfx
="${cur%.*}."
849 __gitcomp
"$(__git_heads)" "$pfx" "$cur" "."
853 local pfx
="${cur%.*}."
856 url fetch push skipDefaultUpdate
857 receivepack uploadpack tagopt
862 local pfx
="${cur%.*}."
864 __gitcomp
"$(__git_remotes)" "$pfx" "$cur" "."
873 core.preferSymlinkRefs
874 core.logAllRefUpdates
875 core.loosecompression
876 core.repositoryFormatVersion
877 core.sharedRepository
878 core.warnAmbiguousRefs
881 core.packedGitWindowSize
896 color.diff.whitespace
902 color.status.untracked
911 gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dvpass
914 gc.reflogexpireunreachable
927 i18n.logOutputEncoding
940 repack.useDeltaBaseOffset
946 receive.denyNonFastForwards
958 while [ $c -lt $COMP_CWORD ]; do
961 add|show|prune|update
) command="$i"; break ;;
966 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
967 __gitcomp
"add show prune update"
973 __gitcomp
"$(__git_remotes)"
976 local i c
='' IFS
=$
'\n'
977 for i
in $
(git
--git-dir="$(__gitdir)" config
--list); do
995 local cur
="${COMP_WORDS[COMP_CWORD]}"
998 __gitcomp
"--mixed --hard --soft"
1002 __gitcomp
"$(__git_refs)"
1007 local cur
="${COMP_WORDS[COMP_CWORD]}"
1011 --max-count= --max-age= --since= --after=
1012 --min-age= --before= --until=
1014 --author= --committer= --grep=
1017 --numbered --summary
1022 __git_complete_revlist
1027 local cur
="${COMP_WORDS[COMP_CWORD]}"
1031 oneline short medium full fuller email raw
1032 " "" "${cur##--pretty=}"
1036 __gitcomp
"--pretty="
1045 __gitcomp
'list show apply clear'
1051 while [ $c -lt $COMP_CWORD ]; do
1052 i
="${COMP_WORDS[c]}"
1054 add|status|init|update
) command="$i"; break ;;
1059 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
1060 local cur
="${COMP_WORDS[COMP_CWORD]}"
1063 __gitcomp
"--quiet --cached"
1066 __gitcomp
"add status init update"
1076 while [ $c -lt $COMP_CWORD ]; do
1077 i
="${COMP_WORDS[c]}"
1080 __gitcomp
"$(__git_tags)"
1090 case "${COMP_WORDS[COMP_CWORD-1]}" in
1096 __gitcomp
"$(__git_tags)"
1102 __gitcomp
"$(__git_refs)"
1109 local i c
=1 command __git_dir
1111 while [ $c -lt $COMP_CWORD ]; do
1112 i
="${COMP_WORDS[c]}"
1114 --git-dir=*) __git_dir
="${i#--git-dir=}" ;;
1115 --bare) __git_dir
="." ;;
1116 --version|
--help|
-p|
--paginate) ;;
1117 *) command="$i"; break ;;
1122 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
1123 case "${COMP_WORDS[COMP_CWORD]}" in
1124 --*=*) COMPREPLY
=() ;;
1133 *) __gitcomp
"$(__git_commands) $(__git_aliases)" ;;
1138 local expansion
=$
(__git_aliased_command
"$command")
1139 [ "$expansion" ] && command="$expansion"
1144 apply
) _git_apply
;;
1145 bisect
) _git_bisect
;;
1146 bundle
) _git_bundle
;;
1147 branch
) _git_branch
;;
1148 checkout
) _git_checkout
;;
1149 cherry
) _git_cherry
;;
1150 cherry-pick
) _git_cherry_pick
;;
1151 commit
) _git_commit
;;
1152 config
) _git_config
;;
1153 describe
) _git_describe
;;
1155 fetch
) _git_fetch
;;
1156 format-patch
) _git_format_patch
;;
1159 ls-remote
) _git_ls_remote
;;
1160 ls-tree
) _git_ls_tree
;;
1162 merge-base
) _git_merge_base
;;
1163 name-rev
) _git_name_rev
;;
1166 rebase
) _git_rebase
;;
1167 remote
) _git_remote
;;
1168 reset) _git_reset
;;
1169 shortlog
) _git_shortlog
;;
1171 show-branch
) _git_log
;;
1172 stash
) _git_stash
;;
1173 submodule
) _git_submodule
;;
1175 whatchanged
) _git_log
;;
1182 local cur
="${COMP_WORDS[COMP_CWORD]}"
1185 __gitcomp
"--not --all"
1189 __git_complete_revlist
1192 complete
-o default
-o nospace
-F _git git
1193 complete
-o default
-o nospace
-F _gitk gitk
1194 complete
-o default
-o nospace
-F _git_am git-am
1195 complete
-o default
-o nospace
-F _git_apply git-apply
1196 complete
-o default
-o nospace
-F _git_bisect git-bisect
1197 complete
-o default
-o nospace
-F _git_branch git-branch
1198 complete
-o default
-o nospace
-F _git_bundle git-bundle
1199 complete
-o default
-o nospace
-F _git_checkout git-checkout
1200 complete
-o default
-o nospace
-F _git_cherry git-cherry
1201 complete
-o default
-o nospace
-F _git_cherry_pick git-cherry-pick
1202 complete
-o default
-o nospace
-F _git_commit git-commit
1203 complete
-o default
-o nospace
-F _git_describe git-describe
1204 complete
-o default
-o nospace
-F _git_diff git-diff
1205 complete
-o default
-o nospace
-F _git_fetch git-fetch
1206 complete
-o default
-o nospace
-F _git_format_patch git-format-patch
1207 complete
-o default
-o nospace
-F _git_gc git-gc
1208 complete
-o default
-o nospace
-F _git_log git-log
1209 complete
-o default
-o nospace
-F _git_ls_remote git-ls-remote
1210 complete
-o default
-o nospace
-F _git_ls_tree git-ls-tree
1211 complete
-o default
-o nospace
-F _git_merge git-merge
1212 complete
-o default
-o nospace
-F _git_merge_base git-merge-base
1213 complete
-o default
-o nospace
-F _git_name_rev git-name-rev
1214 complete
-o default
-o nospace
-F _git_pull git-pull
1215 complete
-o default
-o nospace
-F _git_push git-push
1216 complete
-o default
-o nospace
-F _git_rebase git-rebase
1217 complete
-o default
-o nospace
-F _git_config git-config
1218 complete
-o default
-o nospace
-F _git_remote git-remote
1219 complete
-o default
-o nospace
-F _git_reset git-reset
1220 complete
-o default
-o nospace
-F _git_shortlog git-shortlog
1221 complete
-o default
-o nospace
-F _git_show git-show
1222 complete
-o default
-o nospace
-F _git_stash git-stash
1223 complete
-o default
-o nospace
-F _git_submodule git-submodule
1224 complete
-o default
-o nospace
-F _git_log git-show-branch
1225 complete
-o default
-o nospace
-F _git_tag git-tag
1226 complete
-o default
-o nospace
-F _git_log git-whatchanged
1228 # The following are necessary only for Cygwin, and only are needed
1229 # when the user has tab-completed the executable name and consequently
1230 # included the '.exe' suffix.
1232 if [ Cygwin
= "$(uname -o 2>/dev/null)" ]; then
1233 complete
-o default
-o nospace
-F _git_add git-add.exe
1234 complete
-o default
-o nospace
-F _git_apply git-apply.exe
1235 complete
-o default
-o nospace
-F _git git.exe
1236 complete
-o default
-o nospace
-F _git_branch git-branch.exe
1237 complete
-o default
-o nospace
-F _git_bundle git-bundle.exe
1238 complete
-o default
-o nospace
-F _git_cherry git-cherry.exe
1239 complete
-o default
-o nospace
-F _git_describe git-describe.exe
1240 complete
-o default
-o nospace
-F _git_diff git-diff.exe
1241 complete
-o default
-o nospace
-F _git_format_patch git-format-patch.exe
1242 complete
-o default
-o nospace
-F _git_log git-log.exe
1243 complete
-o default
-o nospace
-F _git_ls_tree git-ls-tree.exe
1244 complete
-o default
-o nospace
-F _git_merge_base git-merge-base.exe
1245 complete
-o default
-o nospace
-F _git_name_rev git-name-rev.exe
1246 complete
-o default
-o nospace
-F _git_push git-push.exe
1247 complete
-o default
-o nospace
-F _git_config git-config
1248 complete
-o default
-o nospace
-F _git_shortlog git-shortlog.exe
1249 complete
-o default
-o nospace
-F _git_show git-show.exe
1250 complete
-o default
-o nospace
-F _git_log git-show-branch.exe
1251 complete
-o default
-o nospace
-F _git_tag git-tag.exe
1252 complete
-o default
-o nospace
-F _git_log git-whatchanged.exe