threads / discuss / 40955

git branch in Bash subshell "$(git branch -a)" including ls output as part of return?

Subject: git branch in Bash subshell "$(git branch -a)" including ls output as part of return?

## tl;dr

4 messages between Dec 7, 2015 and Dec 7, 2015.

replies: 3people: 2as markdown or json

Alex Jones· Dec 7, 2015, 16:52 UTC · lore
Hello Folks,

I am Running OSX 10.10.5 Yosemite along with git 2.6.3 installed via homebrew package manager.

I recently stumbled across the following bug in some scripting I was doing. "git branch -a --list" and "git branch -a" seem to include the output of an "ls" command if executed as part of a subshell in a bash script. I can't speculate to the reason.

Script goal: Delete all branches aside from master in the repository Example outputs from several commands repo:

ls output:

ajonespro:Deploy_Script ajones$ ls -l total 0 drwxr-xr-x 11 ajones wheel 374 Dec 7 10:50 AppDeploy drwxr-xr-x 11 ajones wheel 374 Dec 7 11:15 WebDeploy

git branch -a output:
ajonespro:Deploy_Script ajones$ git branch -a
* DWH_concurrent_api
  Email_No_Error_If_No_Old_Version
  IT/configs_in_app_support
  PHP_Build_Repo
  master
  remotes/origin/DWH_concurrent_api
  remotes/origin/Email_No_Error_If_No_Old_Version
  remotes/origin/IT/configs_in_app_support
  remotes/origin/PHP_Build_Repo
  remotes/origin/master
echo $(git branch -a) output:

ajonespro:Deploy_Script ajones$ echo $(git branch -a) AppDeploy WebDeploy DWH_concurrent_api Email_No_Error_If_No_Old_Version IT/configs_in_app_support PHP_Build_Repo master remotes/origin/DWH_concurrent_api remotes/origin/Email_No_Error_If_No_Old_Version remotes/origin/IT/configs_in_app_support remotes/origin/PHP_Build_Repo remotes/origin/master

While it might be hard to see from that output, The first two "branches" in the subshell's output are actually the directories contained within the repo. If I place a file at the root it includes that in the branch list as well. Since my test file "test.txt" (not shown in example) and "WebDeploy" are sorted before all the branches, I suspect some output buffer is being accidentally being written to.

Has any experienced this before, and can anyone reproduce it on a different configuration? I wouldn't be surprised if it was some weird bug with Apple's included terminal, but since I've only observed it with git branch, I thought I'd try contact git maintainers first.

Charles Bailey· Dec 7, 2015, 16:58 UTC · re: Alex Jones · lore

Re: git branch in Bash subshell "$(git branch -a)" including ls output as part of return?

On Mon, Dec 07, 2015 at 11:52:28AM -0500, Alex Jones wrote:
Show 28 quoted lines
> git branch -a output:
> 
> ajonespro:Deploy_Script ajones$ git branch -a
> 
> * DWH_concurrent_api
>   Email_No_Error_If_No_Old_Version
>   IT/configs_in_app_support
>   PHP_Build_Repo
>   master
>   remotes/origin/DWH_concurrent_api
>   remotes/origin/Email_No_Error_If_No_Old_Version
>   remotes/origin/IT/configs_in_app_support
>   remotes/origin/PHP_Build_Repo
>   remotes/origin/master
> 
> echo $(git branch -a) output:
> 
> ajonespro:Deploy_Script ajones$ echo $(git branch -a)
> AppDeploy WebDeploy DWH_concurrent_api
> Email_No_Error_If_No_Old_Version IT/configs_in_app_support
> PHP_Build_Repo master remotes/origin/DWH_concurrent_api
> remotes/origin/Email_No_Error_If_No_Old_Version
> remotes/origin/IT/configs_in_app_support remotes/origin/PHP_Build_Repo
> remotes/origin/master
> 
> While it might be hard to see from that output, The first two
> "branches" in the subshell's output are actually the directories
> contained within the repo.

Looking at the two outputs, you are seeing the shell's glob expansion of the '*' current branch marker. You probably want to quote the command expansion to prevent this:

echo "$(git branch -a)"
Charles Bailey· Dec 7, 2015, 17:02 UTC · re: Charles Bailey · lore

Re: git branch in Bash subshell "$(git branch -a)" including ls output as part of return?

On Mon, Dec 07, 2015 at 04:58:10PM +0000, Charles Bailey wrote:
Show 6 quoted lines
> 
> Looking at the two outputs, you are seeing the shell's glob expansion of
> the '*' current branch marker. You probably want to quote the command
> expansion to prevent this:
> 
> echo "$(git branch -a)"

Pressing send has, of course, caused me to think further. You probably don't want to parse the output of a "porcelain" command such as "git branch" at all, but instead look at using something like "git for-each-ref", perhaps with the --format=%(refname) option, grepping out master and iterating through the rest.

Alex Jones· Dec 7, 2015, 17:57 UTC · re: Charles Bailey · lore

Re: git branch in Bash subshell "$(git branch -a)" including ls output as part of return?

That did the trick, thanks for the help and the suggestion.
On Mon, Dec 7, 2015 at 12:02 PM, Charles Bailey <charles@hashpling.org> wrote:
Show 13 quoted lines
> On Mon, Dec 07, 2015 at 04:58:10PM +0000, Charles Bailey wrote:
>>
>> Looking at the two outputs, you are seeing the shell's glob expansion of
>> the '*' current branch marker. You probably want to quote the command
>> expansion to prevent this:
>>
>> echo "$(git branch -a)"
>
> Pressing send has, of course, caused me to think further. You probably
> don't want to parse the output of a "porcelain" command such as "git
> branch" at all, but instead look at using something like "git
> for-each-ref", perhaps with the --format=%(refname) option, grepping out
> master and iterating through the rest.
-- 
Alex Jones | Software Engineer
919-238-4404 direct
336-263-2099 mobile
netsertive.com

← back to recent threads