feat: add configurable branch name whitespace replacement

Closes #2663

Adds a new config option `git.branchWhitespaceReplacement` that allows
users to specify the character used to replace whitespace in branch names.

By default, spaces are replaced with dashes ('-'), but teams that prefer
underscores or other characters can now configure this behavior.

Example config:
```yaml
git:
  branchWhitespaceReplacement: '_'
```

Changes:
- Added `BranchWhitespaceReplacement` config option (default: '-')
- Updated `SanitizedBranchName` to accept replacement parameter
- Added `SanitizedBranchNameWithConfig` helper method on RefsHelper
- Updated all callers to use the new config-aware method
This commit is contained in:
Yuxuan Che 2026-01-29 15:00:07 -08:00
parent 443452ad6a
commit 83b182bbe0
3 changed files with 22 additions and 7 deletions

View file

@ -306,6 +306,10 @@ type GitConfig struct {
CommitPrefixes map[string][]CommitPrefixConfig `yaml:"commitPrefixes"`
// See https://github.com/jesseduffield/lazygit/blob/master/docs/Config.md#predefined-branch-name-prefix
BranchPrefix string `yaml:"branchPrefix"`
// Specifies the character used to replace whitespace in branch names when creating new branches.
// By default, spaces are replaced with dashes ("-").
// Some teams use underscores ("_") or other characters.
BranchWhitespaceReplacement string `yaml:"branchWhitespaceReplacement"`
// If true, parse emoji strings in commit messages e.g. render :rocket: as 🚀
// (This should really be under 'gui', not 'git')
ParseEmoji bool `yaml:"parseEmoji"`
@ -855,6 +859,7 @@ func GetDefaultConfig() *UserConfig {
DisableForcePushing: false,
CommitPrefixes: map[string][]CommitPrefixConfig(nil),
BranchPrefix: "",
BranchWhitespaceReplacement: "-",
ParseEmoji: false,
TruncateCopiedCommitHashesTo: 12,
},

View file

@ -707,7 +707,7 @@ func (self *BranchesController) rename(branch *models.Branch) error {
InitialContent: branch.Name,
HandleConfirm: func(newBranchName string) error {
self.c.LogAction(self.c.Tr.Actions.RenameBranch)
if err := self.c.Git().Branch.Rename(branch.Name, helpers.SanitizedBranchName(newBranchName)); err != nil {
if err := self.c.Git().Branch.Rename(branch.Name, self.c.Helpers().Refs.SanitizedBranchNameWithConfig(newBranchName)); err != nil {
return err
}

View file

@ -366,7 +366,7 @@ func (self *RefsHelper) NewBranch(from string, fromFormattedName string, suggest
InitialContent: suggestedBranchName,
HandleConfirm: func(response string) error {
self.c.LogAction(self.c.Tr.Actions.CreateBranch)
newBranchName := SanitizedBranchName(response)
newBranchName := self.SanitizedBranchNameWithConfig(response)
newBranchFunc := self.c.Git().Branch.New
if newBranchName != suggestedBranchName {
newBranchFunc = self.c.Git().Branch.NewWithoutTracking
@ -429,7 +429,7 @@ func (self *RefsHelper) MoveCommitsToNewBranch() error {
InitialContent: suggestedBranchName,
HandleConfirm: func(response string) error {
self.c.LogAction(self.c.Tr.MoveCommitsToNewBranch)
newBranchName := SanitizedBranchName(response)
newBranchName := self.SanitizedBranchNameWithConfig(response)
return self.c.WithWaitingStatus(self.c.Tr.MovingCommitsToNewBranchStatus, func(gocui.Task) error {
return f(newBranchName)
})
@ -576,10 +576,20 @@ func (self *RefsHelper) CanMoveCommitsToNewBranch() *types.DisabledReason {
return nil
}
// SanitizedBranchName will remove all spaces in favor of a dash "-" to meet
// git's branch naming requirement.
func SanitizedBranchName(input string) string {
return strings.ReplaceAll(input, " ", "-")
// SanitizedBranchName will remove all spaces in favor of the specified replacement
// character to meet git's branch naming requirement.
func SanitizedBranchName(input string, replacement string) string {
return strings.ReplaceAll(input, " ", replacement)
}
// SanitizedBranchNameWithConfig returns a sanitized branch name using the
// user's configured whitespace replacement character.
func (self *RefsHelper) SanitizedBranchNameWithConfig(input string) string {
replacement := self.c.UserConfig().Git.BranchWhitespaceReplacement
if replacement == "" {
replacement = "-"
}
return SanitizedBranchName(input, replacement)
}
// Checks if the given branch name is a remote branch, and returns the name of