* Bug report: git reset --hard does not fix submodule worktree
@ 2017-11-04 0:46 Billy O'Neal (VC LIBS)
2017-11-06 20:50 ` Stefan Beller
0 siblings, 1 reply; 2+ messages in thread
From: Billy O'Neal (VC LIBS) @ 2017-11-04 0:46 UTC (permalink / raw)
To: git@vger.kernel.org; +Cc: Stephan T. Lavavej, Cody Miller
Hello, Git folks. I managed to accidentally break the our test lab by attempting to git mv a directory with a submodule inside. It seems like if a reset does an undo on a mv, the workfold entry should be fixed to put the submodule in its old location. Consider the following sequence of commands:
Setup a git repo with a submodule:
mkdir metaproject
mkdir upstream
cd metaproject
git init
cd ..\upstream
git init
echo hello > test.txt
git add -A
git commit -m "an example commit"
cd ..\metapoject
mkdir start
git submodule add ../upstream start/upstream
git add -A
git commit -m "Add submodule in start/upstream."
Move the directory containing the submodule:
git mv start target
git add -A
git commit -m "Moved submodule parent directory."
Check that the worktree got correctly fixed by git mv; this output is as expected:
type .git\modules\start\upstream\config
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
symlinks = false
ignorecase = true
worktree = ../../../../target/upstream
[remote "origin"]
url = C:/Users/bion/Desktop/upstream
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
Now try to go back to the previous commit using git reset --hard:
git log --oneline
1f560be (HEAD -> master) Moved submodule parent directory.
a5977ce Add submodule in start/upstream.
git reset --hard a5977ce
warning: unable to rmdir target/upstream: Directory not empty
HEAD is now at a5977ce Add submodule in start/upstream.
Check that the worktree got fixed correctly; it did not:
type .git\modules\start\upstream\config
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
symlinks = false
ignorecase = true
worktree = ../../../../target/upstream
[remote "origin"]
url = C:/Users/bion/Desktop/upstream
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
Is git reset intended to put the submodule in the right place? If not, is there a command we can run before/after reset to restore consistency?
Thanks folks!
Billy O'Neal
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: Bug report: git reset --hard does not fix submodule worktree
2017-11-04 0:46 Bug report: git reset --hard does not fix submodule worktree Billy O'Neal (VC LIBS)
@ 2017-11-06 20:50 ` Stefan Beller
0 siblings, 0 replies; 2+ messages in thread
From: Stefan Beller @ 2017-11-06 20:50 UTC (permalink / raw)
To: Billy O'Neal (VC LIBS)
Cc: git@vger.kernel.org, Stephan T. Lavavej, Cody Miller
On Fri, Nov 3, 2017 at 5:46 PM, Billy O'Neal (VC LIBS)
<bion@microsoft.com> wrote:
> Hello, Git folks. I managed to accidentally break the our test lab by attempting to git mv a directory with a submodule inside. It seems like if a reset does an undo on a mv, the workfold entry should be fixed to put the submodule in its old location. Consider the following sequence of commands:
>
> Setup a git repo with a submodule:
> mkdir metaproject
> mkdir upstream
> cd metaproject
> git init
> cd ..\upstream
> git init
> echo hello > test.txt
> git add -A
> git commit -m "an example commit"
> cd ..\metapoject
> mkdir start
> git submodule add ../upstream start/upstream
> git add -A
> git commit -m "Add submodule in start/upstream."
>
> Move the directory containing the submodule:
> git mv start target
> git add -A
> git commit -m "Moved submodule parent directory."
>
> Check that the worktree got correctly fixed by git mv; this output is as expected:
> type .git\modules\start\upstream\config
> [core]
> repositoryformatversion = 0
> filemode = false
> bare = false
> logallrefupdates = true
> symlinks = false
> ignorecase = true
> worktree = ../../../../target/upstream
> [remote "origin"]
> url = C:/Users/bion/Desktop/upstream
> fetch = +refs/heads/*:refs/remotes/origin/*
> [branch "master"]
> remote = origin
> merge = refs/heads/master
>
> Now try to go back to the previous commit using git reset --hard:
> git log --oneline
> 1f560be (HEAD -> master) Moved submodule parent directory.
> a5977ce Add submodule in start/upstream.
> git reset --hard a5977ce
> warning: unable to rmdir target/upstream: Directory not empty
> HEAD is now at a5977ce Add submodule in start/upstream.
>
> Check that the worktree got fixed correctly; it did not:
> type .git\modules\start\upstream\config
> [core]
> repositoryformatversion = 0
> filemode = false
> bare = false
> logallrefupdates = true
> symlinks = false
> ignorecase = true
> worktree = ../../../../target/upstream
> [remote "origin"]
> url = C:/Users/bion/Desktop/upstream
> fetch = +refs/heads/*:refs/remotes/origin/*
> [branch "master"]
> remote = origin
> merge = refs/heads/master
>
> Is git reset intended to put the submodule in the right place?
>
> Thanks folks!
git-reset sounds like it ought to put submodules back into another directory.
Historically git-reset did not touch submodules at all; a recent
release introduced
the --recurse-submodules flag for git-reset, which would cover this situation.
However that particular situation (with moving the submodules) seems to be
not covered yet,
./t7112-reset-submodule.sh
...
not ok 69 - git reset --hard: replace submodule with a directory must
fail # TODO known breakage
> If not, is there a command we can run before/after reset to restore consistency?
The submodule "fix-it-all" command would be
git submodule update --init --recursive
IMHO.
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2017-11-06 20:50 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-11-04 0:46 Bug report: git reset --hard does not fix submodule worktree Billy O'Neal (VC LIBS)
2017-11-06 20:50 ` Stefan Beller
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).