git svn dcommit提交错误的文件?

时间:2015-03-13 20:17:45

标签: git git-svn

好吧,我有一个复杂的设置,我使用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

将其推送/上传到svn
$ 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?

1 个答案:

答案 0 :(得分:0)

编辑:发现:git-svn-id is missing from some commits - 它似乎有所帮助;诀窍是对fetchgit 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版本,并造成一团糟 - 好吧,这是我希望我避免的,并没有;不知道现在该做什么......