git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] completion: exclude previous file arguments in Zsh

From
FGFionn via GitGitGadget <gitgitgadget@gmail.com>
Date
Oct 3, 2026, 11:22 UTC
Message-ID
<pull.2216.git.git.1791026527023.gitgitgadget@gmail.com>
From: Fionn Fitzmaurice <git@fionn.email>

When using the _git completion function bundled with Zsh (https://sf.net/p/zsh/code/ci/master/tree/Completion/Unix/Command/_git), duplicate files in an argument list will not be offered as completion candidates.

For example, suppose we have untracked files aa and ab (only). Then with the Zsh completion,

    git add aa a<tab>

would not offer both aa and ab as completion candidates, rather it would complete ab only.

This behaviour is not present in git-completion.zsh shipped with Git, which does not deduplicate arguments.

We can get this with minor changes, however. Here we introduce an array __git_file_exclude which we populate with existing arguments and then tell compadd to exclude them, which closely matches the Zsh _git completion behaviour (as well as common programs such as rm).

Signed-off-by: Fionn Fitzmaurice <git@fionn.email>
---
    completion: exclude previous file arguments in Zsh
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-2216%2Ffionn%2Fzsh-completion-exclude-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-2216/fionn/zsh-completion-exclude-v1
Pull-Request: https://github.com/git/git/pull/2216
 contrib/completion/git-completion.zsh | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/contrib/completion/git-completion.zsh b/contrib/completion/git-completion.zsh
index d5c526665b..26444923c1 100644
--- a/contrib/completion/git-completion.zsh
+++ b/contrib/completion/git-completion.zsh
@@ -117,7 +117,7 @@ __gitcomp_file ()
 	emulate -L zsh
 
 	compset -P '*[=:]'
-	compadd -f -p "${2-}" -- ${(f)1} && _ret=0
+	compadd -f -p "${2-}" -F __git_file_exclude -- ${(f)1} && _ret=0
 }
 
 __gitcomp_direct_append ()
@@ -284,6 +284,8 @@ __git_zsh_main ()
 
 		(( $+opt_args[--help] )) && command='help'
 
+		__git_file_exclude=(${words[2,-1]:#${words[CURRENT]}})
+
 		words=( ${orig_words[@]} )
 
 		__git_zsh_bash_func $command
@@ -296,6 +298,7 @@ _git ()
 	local _ret=1
 	local cur cword prev
 	local __git_repo_path
+	local -a __git_file_exclude
 
 	cur=${words[CURRENT]}
 	prev=${words[CURRENT-1]}

base-commit: c46c1e37724f0478939de636ab8ea5a89086d532
-- 
gitgitgadget
Next: SZEDER Gábor
Message 1 of 5 in “completion: exclude previous file arguments in Zsh”
  1. completion: exclude previous file arguments in ZshFionn via GitGitGadget, Oct 3, 2026
  2. SZEDER GáborOct 4, 2026
  3. FionnOct 4, 2026
  4. Junio C HamanoOct 4, 2026
  5. FionnOct 5, 2026

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.