好吧,我有一个复杂的设置,我使用git版本1.7.9.5,并有一个git存储库,在git端是一个裸存储库的克隆;在svn方面,应该是远程SVN存储库的克隆。另一方面,没有分支,一切都在master中完成。
远程存储库已脱机一段时间了;它刚刚回来,我似乎设法通过git svn dcommit
上传所有未完成的提交。
问题是现在,我尝试在此之后进行新的更改/提交;并且看似dcommit
想要上传错误的文件 - 并且在'交易过期时失败&#39 ;;我看到How to recover from an unwanted rename using git-svn: "Transaction is out of date",但似乎没有回答这个问题。
设置有点像这样:
$ git config -l
svn-remote.svn.url=svn+ssh://user@myserver/remotepath/to/repo_svn
svn-remote.svn.fetch=:refs/remotes/git-svn
..
remote.origingit.url=file:///local/path/to/repo_bare.git
remote.origingit.fetch=+refs/heads/*:refs/remotes/origingit/*
然后我从本地裸露的回购git中拉出来:
$ git svn fetch
user@myserver's password:
$ git pull --rebase origingit master
From file:///local/path/to/repo_bare
* branch master -> FETCH_HEAD
Current branch master is up to date.
$ git status -uno
# On branch master
nothing to commit (use -u to show untracked files)
我检查一下SVN版本是否存在差异:
# https://stackoverflow.com/questions/2426654/git-svn-status-showing-changes-that-are-not-committed-to-svn
$ git diff git-svn HEAD
diff --git a/folder/file.tex b/folder/file.tex
index 7201cc7..3df14bc 100644
--- a/folder/file.tex
+++ b/folder/file.tex
@@ -299,7 +299,7 @@ Test
-% test
+% test
% still testing
$ git diff --name-status remotes/git-svn
M folder/file.tex
......并且文件folder/file.tex
中存在 - 并且是正确的更改;所以我尝试使用dcommit
$ git svn dcommit --verbose
Committing to svn+ssh://user@myserver/remotepath/to/repo_svn ...
user@myserver's password:
M notes.txt
Transaction is out of date: File '/notes.txt' is out of date at /usr/lib/git-core/git-svn line 922
现在,我希望上传的文件是./folder/file.tex
;然而git svn dcommit试图上传./notes.txt
- 确实存在,但是在这次提交中还没有改变它?!
有趣的是,如果我在这里:
$ git svn rebase
user@myserver's password:
First, rewinding head to replay your work on top of it...
$ git diff --name-status remotes/git-svn
$ git svn dcommit
Committing to svn+ssh://user@myserver/remotepath/to/repo_svn ...
$
...如果我首先git svn rebase
而不是git svn fetch
,那么git端和svn端之间没有区别,因此我什么也得不到{{1} ed(所以我甚至没有得到密码提示)。编辑:请注意,如果我在dcommit
后执行git pull --rebase origingit master
,则会发生与之前相同的情况(即git svn rebase
看到正确的更改,但git diff --name-status
会失败,并且#34;已经过时了:")
所以我的问题是 - 为什么git svn dcommit
坚持上传这个错误的文件(如果先运行git svn dcommit
) - 而不是{{1}正确报告的正确文件} ??我怎么检查呢?
如何强制git svn fetch
正确地将本地git更改同步到远程SVN?
答案 0 :(得分:0)
fetch
和git svn
使用git
,如此处所述;然后使用cherry-pick
进行需要dcommit
的剩余提交;显然这项业务正在被困?"在第60版是由于该修订是最后一个具有适当的git-svn-id:
我到了某个地方,但没有解决它;但可能部分回答为什么提交错误的文件。
在git svn rebase
后,我有:
$ git svn info
...
Revision: 446
...
Last Changed Rev: 446
git log --graph --decorate --pretty=oneline --abbrev-commit --all --date-order
* aaaa100 (HEAD, git-svn, master) : null edit -
* aaaa099 : some more testing
* aaaa098 : some testing
* aaaa097 : just testing
...
请注意,此处的修订是最新的(446),日志基本上显示了"直接"一直排队。
完成git pull --rebase origingit master
之后,我得到:
$ git svn info
...
Revision: 60
...
Last Changed Rev: 60
git log --graph --decorate --pretty=oneline --abbrev-commit --all --date-order | less
* aaaa100 (git-svn) : null edit -
* aaaa099 : some more testing
...
* aaaa030 some early commit
* aaaa029 : early commit
* aaaa028 : old commit
| * bbbb101 (HEAD, master) : another null edit; previous attempt failed,
| * bbbb100 : null edit -
| * bbbb099 : some more testing
...
| * bbbb030 some early commit
| * bbbb029 : early commit
| * bbbb028 : old commit
* | aaaa027 : very old commit
| * bbbb027 : very old commit
所以在这里,日志更准确,因为它可以正确地显示svn和git日志之间的差异(即svn和git在底部是交错的,当服务器工作时,git和svn提交是连续的;然后那里是由于服务器脱机而提交顺序的中断) - 并正确显示新版本;但由于某种原因,它也认为它处于非常早期的SVN版本(60) - 使它想要发送在该版本中修改过的文件;所以可能是错误文件的原因。 (哈希值因可读性而改变)
我看到了一点/usr/lib/git-core/git-svn
- 似乎它使用某种git命令来计算版本号,但目前无法从Perl代码中获得更多。
请注意,git pull
没有--rebase
的结果是:
$ git pull origingit master
From file:///local/path/to/repo_bare
* branch master -> FETCH_HEAD
Auto-merging folder/file.tex
CONFLICT (add/add): Merge conflict in folder/file.tex
Automatic merge failed; fix conflicts and then commit the result.
所以我调查了How to handle/fix git add/add conflicts?,最终尝试了:
$ git pull --strategy=subtree origingit master
From file:///local/path/to/repo_bare
* branch master -> FETCH_HEAD
Merge made by the 'subtree' strategy.
folder/file.tex | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
这可能看起来不错,但它不是 - 它不仅仅复制bbbb101 another null edit; previous attempt failed
提交;它基于它进行合并;所以现在我有:
$ git log --graph --decorate --pretty=oneline --abbrev-commit --all --date-order | less
* 9579e8b (HEAD, git-svn, master) Merge branch 'master' of file:///local/path/to/repo_bare
|\
* | aaaa100 : null edit -
...
绝对不是我想要的;并且随后尝试重复该过程失败了:
Applying: : second commit after git transition (first failed a bit)
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging notes.txt
CONFLICT (content): Merge conflict in notes.txt
Failed to merge in the changes.
Patch failed at 0001 : second commit after git transition (first failed a bit)
When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To check out the original branch and stop rebasing run "git rebase --abort".
所以它再次恢复到旧的SVN版本,并造成一团糟 - 好吧,这是我希望我避免的,并没有;不知道现在该做什么......