diff --git a/mercurial/subrepo.py b/mercurial/subrepo.py --- a/mercurial/subrepo.py +++ b/mercurial/subrepo.py @@ -678,7 +678,14 @@ class gitsubrepo(object): def get(self, state): source, revision, kind = state self._fetch(source, revision) - if self._gitstate() == revision: + # if the repo was set to be bare, unbare it + if self._gitcommand(['config', '--get', 'core.bare'] + ).strip() == 'true': + self._gitcommand(['config', 'core.bare', 'false']) + if self._gitstate() == revision: + self._gitcommand(['reset', '--hard', 'HEAD']) + return + elif self._gitstate() == revision: return current, bm = self._gitbranchmap() if revision not in bm: @@ -742,6 +749,24 @@ class gitsubrepo(object): 'nothing to push') % self._relpath) return False + def remove(self): + if self.dirty(): + self._ui.warn(_('not removing repo %s because ' + 'it has changes.\n') % self._path) + return + # we can't fully delete the repository as it may contain + # local-only history + self._ui.note(_('removing subrepo %s\n') % self._path) + self._gitcommand(['config', 'core.bare', 'true']) + for f in os.listdir(self._path): + if f == '.git': + continue + path = os.path.join(self._path, f) + if os.path.isdir(path) and not os.path.islink(path): + shutil.rmtree(path) + else: + os.remove(path) + types = { 'hg': hgsubrepo, 'svn': svnsubrepo, diff --git a/tests/test-subrepo-git.t b/tests/test-subrepo-git.t --- a/tests/test-subrepo-git.t +++ b/tests/test-subrepo-git.t @@ -175,3 +175,21 @@ user a pulls, merges, commits adding manifests adding file changes added 2 changesets with 2 changes to 1 files + +update to a revision without the subrepo, keeping the local git repository + + $ cd ../t + $ hg up 0 + 0 files updated, 0 files merged, 2 files removed, 0 files unresolved + $ ls s -a + . + .. + .git + + $ hg up 2 + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ ls s -a + . + .. + .git + g