diff --git a/pkg/commands/git.go b/pkg/commands/git.go index 90fbc9890..c2c617b68 100644 --- a/pkg/commands/git.go +++ b/pkg/commands/git.go @@ -375,6 +375,23 @@ func includesInt(list []int, a int) bool { // ResetAndClean removes all unstaged changes and removes all untracked files func (c *GitCommand) ResetAndClean() error { + submoduleConfigs, err := c.GetSubmoduleConfigs() + if err != nil { + return err + } + + if len(submoduleConfigs) > 0 { + for _, config := range submoduleConfigs { + if err := c.SubmoduleStash(config); err != nil { + return err + } + } + + if err := c.SubmoduleUpdateAll(); err != nil { + return err + } + } + if err := c.ResetHard("HEAD"); err != nil { return err } diff --git a/pkg/commands/submodules.go b/pkg/commands/submodules.go index ad130544c..7debb7d91 100644 --- a/pkg/commands/submodules.go +++ b/pkg/commands/submodules.go @@ -58,9 +58,20 @@ func (c *GitCommand) GetSubmoduleConfigs() ([]*SubmoduleConfig, error) { } func (c *GitCommand) SubmoduleStash(config *SubmoduleConfig) error { + // if the path does not exist then it hasn't yet been initialized so we'll swallow the error + // because the intention here is to have no dirty worktree state + if _, err := os.Stat(config.Path); os.IsNotExist(err) { + c.Log.Infof("submodule path %s does not exist, returning", config.Path) + return nil + } + return c.OSCommand.RunCommand("git -C %s stash --include-untracked", config.Path) } func (c *GitCommand) SubmoduleReset(config *SubmoduleConfig) error { return c.OSCommand.RunCommand("git submodule update --force %s", config.Name) } + +func (c *GitCommand) SubmoduleUpdateAll() error { + return c.OSCommand.RunCommand("git submodule update --force") +}