git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: "Torsten Bögershausen" <tboegi@web.de>
To: Patakreyp Chandler <patakreyp.chandler@gmail.com>
Cc: git@vger.kernel.org
Subject: Re: Git oddities with case of branch names on Windows
Date: Wed, 15 Feb 2023 17:53:38 +0100	[thread overview]
Message-ID: <20230215165337.kq3d6xx6gbiamfsg@tb-raspi4> (raw)
In-Reply-To: <CAAR1xzR9Vu8we4kBkd7rM2NAC63frxZs7Zr4wYNj3beNHtw0Mg@mail.gmail.com>

On Wed, Feb 15, 2023 at 02:28:38PM +0100, Patakreyp Chandler wrote:
> Hello,
>
> Here is a scenario for some oddities (bugs?) for case of branch names
> (at least with git version 2.37.3.windows.1).
>
> First, we have created an empty git repository on our internal GitHub
> server and we clone this repository
>     $ git clone git@github.mycompany.com:ID123456/test_branches.git ppppppp
>     Cloning into 'ppppppp'...
>     warning: You appear to have cloned an empty repository.
>
> Then we create an object in this repository on main branch, we add,
> commit and push it:
>     $ cd ppppppp/
>     $ echo foo > foo
>     $ git add foo
>      warning: in the working copy of 'foo', LF will be replaced by
> CRLF the next time Git touches it
>     $ git commit -m 'foo'
>      [main (root-commit) 51789b0] foo
>      1 file changed, 1 insertion(+)
>      create mode 100644 foo
>     $ git push
>      Enumerating objects: 3, done.
>      Counting objects: 100% (3/3), done.
>      Writing objects: 100% (3/3), 869 bytes | 869.00 KiB/s, done.
>      Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
>      To github.mycompany.com:ID123456/test_branches.git
>      * [new branch]      main -> main
>
> We create a new branch in this repository and switch to it:
>     $ git checkout -b gggg
>      Switched to a new branch 'gggg'
>
> We create an object in this repository on the new branch, we add,
> commit and push it:
>     $ echo bar > bar
>     $ git add bar
>      warning: in the working copy of 'bar', LF will be replaced by
> CRLF the next time Git touches it
>     $ git commit -m 'bar'
>      [gggg 8f2fdd0] bar
>      1 file changed, 1 insertion(+)
>      create mode 100644 bar
>     $ git push --set-upstream origin gggg
>      Enumerating objects: 4, done.
>      Counting objects: 100% (4/4), done.
>      Delta compression using up to 4 threads
>      Compressing objects: 100% (2/2), done.
>      Writing objects: 100% (3/3), 929 bytes | 929.00 KiB/s, done.
>      Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
>      remote:
>      remote: Create a pull request for 'gggg' on GitHub by visiting:
>      remote:
> https://github.mycompany.com/ID123456/test_branches/pull/new/gggg
>      remote:
>      To github.mycompany.com:ID123456/test_branches.git
>      * [new branch]      gggg -> gggg
>      branch 'gggg' set up to track 'origin/gggg'.
>
> If we look at the local branches, everything is normal:
>     $ git branch -vv
>      * gggg 8f2fdd0 [origin/gggg] bar
>        main 51789b0 [origin/main] foo
>
> Now we “switch” to the exact same branch but with a typo (here, 'GGGG'
> instead of 'gggg') in the case of branch name (this does not work with
> git on Linux "error: pathspec 'GGGG' did not match any file(s) known
> to git."):
>     $ git checkout GGGG
>      Switched to branch 'GGGG'
>
> We create an object in this repository on the (not really) new branch
> (with faulty case name), we add, commit and (try to) push it:
>     $ echo foobar > foobar
>     $ git add foobar
>      warning: in the working copy of 'foobar', LF will be replaced by
> CRLF the next time Git touches it
>     $ git commit -m 'foobar'
>      [GGGG 2ed967b] foobar
>      1 file changed, 1 insertion(+)
>      create mode 100644 foobar
>     $ git push
>     fatal: The current branch GGGG has no upstream branch.
>     To push the current branch and set the remote as upstream, use
>             git push --set-upstream origin GGGG
>     To have this happen automatically for branches without a tracking
>     upstream, see 'push.autoSetupRemote' in 'git help config'.
>
> Pushing actually fails because git says "The current branch GGGG has
> no upstream branch ", and if we check this badly cased branch ("GGGG")
> has no upstream tracked branch, but is still the same correctly cased
> branch ("gggg"):
>     $ git branch -vv
>      * GGGG 2ed967b foobar
>         main 51789b0 [origin/main] foo
>     $ git branch -a
>      * GGGG
>        main
>        remotes/origin/gggg
>        remotes/origin/main
>
> Switching back to the correctly cased branch does not seem to put back
> everything in order (list of branches is broken), but "git push"
> works, at least:
>     $ git checkout -
>      Switched to branch 'gggg'
>        Your branch is ahead of 'origin/gggg' by 1 commit.
>        (use "git push" to publish your local commits)
>     $ git branch -vv
>      GGGG 2ed967b foobar
>      main 51789b0 [origin/main] foo
>     $ git push
>      Enumerating objects: 4, done.
>      Counting objects: 100% (4/4), done.
>      Delta compression using up to 4 threads
>      Compressing objects: 100% (2/2), done.
>      Writing objects: 100% (3/3), 962 bytes | 962.00 KiB/s, done.
>      Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
>      To github.mycompany.com:ID123456/test_branches.git
>      8f2fdd0..2ed967b  gggg -> gggg
>
> Even trying to switch to other branches, still does not correct this situation:
>     $ git branch -vv
>       GGGG 2ed967b foobar
>       main 51789b0 [origin/main] foo
>     $ git checkout main
>      Switched to branch 'main'
>      Your branch is up to date with 'origin/main'.
>     $ git branch -vv
>        GGGG 2ed967b foobar
>      * main 51789b0 [origin/main] foo
>     $ git checkout gggg
>      Switched to branch 'gggg'
>      Your branch is up to date with 'origin/gggg'.
>     $ git branch -vv
>       GGGG 2ed967b foobar
>       main 51789b0 [origin/main] foo
>    $ git branch -a
>       GGGG
>       main
>      remotes/origin/gggg
>      remotes/origin/main
>     $ git checkout Gggg
>      Switched to branch 'Gggg'
>     $ git branch -a
>       GGGG
>       main
>       remotes/origin/gggg
>       remotes/origin/main
>
>  Any idea of what's going on? And how to fix it?

Thanks for the extensive written report,
very much appreciated to see a reproducable example.
For a longer discussion, see below.

If you want to get rid of the GGGG branch, I would suggest something
in tis style:

git checkout -b tmpbranch
git branch -d GGGG
git checkout -b gggg
git branch -d tmpbranch

Is there a better solution ?
The problem is that your file system treats GGGG as gggg

Running `git pack-refs` could help. But there may be disadvantages
for people having many many branches.
(And then there had been some efforts to write a new backend for refs,
but I didn't follow that up).

My suggestion is to use lowercase for branch names only.

https://git.vger.kernel.narkive.com/PrwMfgXR/branch-name-case-sensitivity

  reply	other threads:[~2023-02-15 16:53 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <CAAR1xzQwhbHNFFyTJQvkSVLJyJz_Gj5_FQ_udJrjM=ou+3GB3w@mail.gmail.com>
2023-02-15 13:28 ` Git oddities with case of branch names on Windows Patakreyp Chandler
2023-02-15 16:53   ` Torsten Bögershausen [this message]
2023-02-16  7:03     ` Patakreyp Chandler

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230215165337.kq3d6xx6gbiamfsg@tb-raspi4 \
    --to=tboegi@web.de \
    --cc=git@vger.kernel.org \
    --cc=patakreyp.chandler@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).