Unerwarteter Fehler beim Zusammenführen in einem Git-SVN-System?

Ich habe ein etwas verschlungenes Setup (wie ingit svn dcommit eine falsche Datei festschreiben?) das sieht ungefähr so aus (hergestellt in Dia, testrepo.dia, Veröffentlicht indieser Kern) - und wird mit dem folgenden Skript simuliert,testrepo.sh:

rundsätzlich hatte ich ein SVN-Repository auf einem Webserver myrepo_svn_WS), mit dem ich zuerst über eine SVN-Arbeitskopie auf meinem lokalen PC gearbeitet habe myrepo_svnco). Nach einer Weile hörte ich damit auf und ging zugit-svn; Aber anstatt es direkt von meinem lokalen PC aus zu benutzen, hatte ich ein @ eingerichtemyrepo_gitsvn auf meinem lokalen Server; daraus wird ein nackter Git-Repo auf dem lokalen Server gemacht,myrepo_git_LS.git, das als entfernter Ursprung des @ hinzugefügt wimyrepo_gitsvn. Die Idee ist dann, dass ich von lokalen PCs in Bezug auf @ arbeiten kamyrepo_git_LS.git, und halten Sie das lokale Netzwerk synchron, auch wenn der SVN-Webserver vorübergehend offline ist.

Das folgende Skript,testrepo.sh, simuliert diesen Vorgang lokal - einschließlich desmyrepo_svn_WS offline gehen. Wenn Sie das Skript so verwenden, wie es ist, werden Sie feststellen, dass das System von dem SVN-WS-Server, der offline geht, "wiederherstellen" kann. In diesem Fall lautet das Protokoll "@" testrepo_nofail.log. Wenn Sie jedoch das @ auskommentier#~ kommentierte Zeilen, die ein @ machgit fetch origingit, Sie werden feststellen, dass der Prozess fehlschlägt, für den das Protokoll @ laute testrepo_fail.log:

remote: Using index info to reconstruct a base tree...
remote: Falling back to patching base and 3-way merge...
remote: Auto-merging folder/file.txt
remote: CONFLICT (content): Merge conflict in folder/file.txt
remote: Failed to merge in the changes.
remote: Patch failed at 0001 5th git commit
remote: 
remote: When you have resolved this problem run "git rebase --continue".
remote: If you would prefer to skip this patch, instead run "git rebase --skip".
remote: To check out the original branch and stop rebasing run "git rebase --abort".

Was mich hier verwirrt (und warum ich das unerwartet finde) - ist, dass ich das @ bnu user hier und damit benutze ich gar keine Nebenstellen! Wie könnte ich in diesem Fall möglicherweise einen "Zusammenführungskonflikt" bekommen?

Die Sache ist - jetzt ist das System tatsächlich in diesem fehlerhaften Zustand gelandet; Meine Frage lautet also: Wie kann ich das System wieder in den ordnungsgemäßen Betriebszustand versetzen, so dass ich bei einem Commit und einem Push vom lokalenmyrepo_git_wc, der SVN-Web-Servermyrepo_svn_WS richtig aktualisiert?

Ein paar Anmerkungen zum Vergleich der Protokolle mitmeld:

Beachten Sie, dass der Prozess direkt nach dem Teil "Simulieren des Zusammenführungskonflikts über Git-Abruf" ordnungsgemäß zu verlaufen scheint - außer dass es jetzt ein @ giborigingit/master branch (zum Vergrößern anklicken):

Ich habe nicht viel darüber nachgedacht, weil ich nicht an @ gedacht hagit-svn als Zweigstelle; aber hier ist eine Unterfrage: vongit-svn undorigingit/master, welcher ist ein Zweig?

Dieser Teil endet hier:

Beachten Sie, dass der nicht fehlgeschlagene Prozess am Ende den Protokolldiagrammbaum als "komprimiert" oder "abgeflacht" anzeigt (dh es ragen keine Zweige heraus) - während der fehlgeschlagene Prozess zu diesem Zeitpunkt keine Fehler beklagt, sondern anzeigt der Log-Graph-Baum als verzweigt.

Das Problem tritt erst nach dem '6th git commit' auf:

Der fehlgeschlagene Prozess startet tatsächlich, aus irgendeinem Grund wird '5th git commit' angewendet, was zu diesem Zeitpunkt bereits hätte behandelt werden müssen. und an diesem Punkt tritt der Zusammenführungskonflikt auf.

So, vorausgesetzt mein System (oder vielmehrmyrepo_gitsvn) befindet sich in diesem fehlerhaften Zustand. Was kann ich tun, um ihn wiederherzustellen?

Hier ist dastestrepo.sh code:

set -x

rm -rf /tmp/myrepo*
cd /tmp

echo "simulating svn web server repo"

svnadmin create myrepo_svn_WS
# svn co file:///tmp/myrepo_svn_WS myrepo_svnco
read -s -p "Enter ssh pass [note, you will be prompted again via GUI for the same]: " SSHPASS
export SSHPASS
# note: the next command will again prompt for sshpass in GUI once, regardless of the SSHPASS variable
sshpass -e svn co svn+ssh://localhost/tmp/myrepo_svn_WS myrepo_svnco
cd /tmp/myrepo_svnco

echo "Adding first commits via svn"

echo aaa > AA.txt
svn add AA.txt
sshpass -e svn ci -m 'first svn commit'

echo bbb > BB.txt
svn add BB.txt
sshpass -e svn ci -m '2nd svn commit'

echo ccc > CC.txt
svn add CC.txt
sshpass -e svn ci -m '3rd svn commit'

echo ddd > DD.txt
svn add DD.txt
sshpass -e svn ci -m '4th svn commit'

echo eee > EE.txt
svn add EE.txt
sshpass -e svn ci -m '5th svn commit'

cd /tmp
echo "Cloning svn as git"

sshpass -e git svn clone svn+ssh://localhost/tmp/myrepo_svn_WS myrepo_gitsvn

echo "Cloning a bare git local server"

git clone --bare myrepo_gitsvn myrepo_git_LS.git

echo "Adding a git local server remote to the gitsvn"

cd /tmp/myrepo_gitsvn
git remote add origingit file:///tmp/myrepo_git_LS.git

cd /tmp
cat > /tmp/myrepo_git_LS.git/hooks/post-update <<EOF
#!/usr/bin/env bash
export SSHPASS=${SSHPASS}
#export GIT_DIR="."
git update-server-info
export GIT_DIR=".git"
echo "post-update kicking in"
cd /tmp/myrepo_gitsvn
git pull --rebase origingit master
git log --graph --decorate --pretty=oneline --abbrev-commit --all --date-order
sshpass -e git svn rebase
sshpass -e git svn dcommit
sshpass -e git svn rebase
git log --graph --decorate --pretty=oneline --abbrev-commit --all --date-order
EOF
chmod +x /tmp/myrepo_git_LS.git/hooks/post-update

cd /tmp
echo "Cloning a git local server to git local working copy"

sshpass -e git clone ssh://localhost/tmp/myrepo_git_LS.git myrepo_git_wc

cd /tmp/myrepo_git_wc
echo "Working from git local working copy now"
git config user.name me
git config user.email [email protected]

mkdir folder
echo hhh > folder/file.txt
git add folder/file.txt
git commit -m "1st git commit"
sshpass -e git push origin master

echo iiii >> folder/file.txt
git add folder/file.txt
git commit -m "2nd git commit"
sshpass -e git push origin master

echo "Simulating svn server offline; git wc commits get added"
mv /tmp/myrepo_svn_WS /tmp/.myrepo_svn_WS

echo jjj >> folder/file.txt
echo jjj > folder/file2.txt
git add folder/file*.txt
git commit -m "3rd git commit"
sshpass -e git push origin master

echo kkkk >> folder/file.txt
echo kkkk >> folder/file2.txt
git add folder/file*.txt
git commit -m "4th git commit"
sshpass -e git push origin master

echo "Simulating svn server back online; git wc commits get added"
mv /tmp/.myrepo_svn_WS /tmp/myrepo_svn_WS

#~ echo "Simulating merge conflict via git fetch"
#~ (cd /tmp/myrepo_gitsvn; git fetch origingit)

echo lll >> folder/file.txt
git add folder/file.txt
git commit -m "5th git commit"
sshpass -e git push origin master

echo mmm >> folder/file.txt
git add folder/file.txt
git commit -m "6th git commit"
sshpass -e git push origin master

Antworten auf die Frage(2)

Ihre Antwort auf die Frage