When I add a new tool to git-gui, the dialog indicates that I could use some variables to be passed to the tool ($REVISION, $ARGS, $FILENAME).

Are there any other parameters that are not documented (for example the current repo directory, etc.)? Why are they not contained in the documentation of the git-gui?

My current use case is that I have two scripts that enable/disable a pre-commit hook. Currently, I have to open my Windows Explorer and double-click the batch-files which is a bit clumsy. Easier way would be to do that directly out of git-gui...

As an alternative (side-question), I would also be interested in bypassing the pre-commit hook (i.e. pass --no-verify when committing) out of git-gui.

有帮助吗?

解决方案

When looking at the git-gui sources, I find (not present in git-gui man page):

  • git-gui.sh:
    • $GITGUI_VERBOSE, to enable verbose loading
    • SSH_ASKPASS, to suggest our implementation of askpass, if none is set
    • GIT_DIR and GIT_WORK_TREE, for repository setup

其他提示

I personal extended git-gui for having tools working on multiple files

In the tools.tcl file, add the following 2 lines

set env(GIT_GUITOOL) $fullname
set env(FILENAME) $current_diff_path
>> set env(FILENAMES) [array names selected_paths]

and :

unset env(GIT_GUITOOL)
unset env(FILENAME)
>> unset env(FILENAMES)

Use $FILENAMES instead of $FILENAME in your tool, and list of files will be passed on separated by spaces (very useful for creating a tool like : rm $FILENAMES )

Note on $FILENAME (and $FILENAMES) Git gui tool mechanism doesn't work with files containing spaces I tried quoting each file, by writing

set env(FILENAMES) [string map { \{ \" \} \" } [array names selected_paths]]

But Console::exec seems to separate args on space and escape each argument.

Two notes to the previous solution:

  1. global selected_paths

to post non empty $FILENAMES to the command it is neccessary to declare selected_paths as global

  1. files containing spaces

to post files containing spaces use "${FILENAMES[@]}" instead of plain $FILENAMES.

You can see how the pathes are sent to a command by using command printf '\"%s\" ' e.g.

printf '\"%s\" ' FILENAMES= "${FILENAMES[@]}"

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top