如何在执行 'git svn dcommit' 命令之前查看更改内容?

21

使用 svn-git,如何查看即将通过 git svn dcommit 提交的内容?

这是我执行的命令:

git svn  clone file:///svn/test1 test1-git
cd test1-git
echo "first line" > test1.txt 
git add test1.txt 
git commit 

现在已经提交到Git存储库了 -- 很好。但在执行git svn dcommit之前,我想查看包含将提交到SVN存储库的更改的差异。


3
你找到答案了吗? - Mr_and_Mrs_D
4个回答

16
如果你的远程分支名为git-svn(如果你只执行了git svn clone,它就会被称为这个),那么你可以查看当前分支和git-svn之间的差异:
git diff git-svn HEAD

您将会看到当前分支中存在但 SVN 存储库中不存在的所有更改。


对我没用,我按照克隆时的建议添加了前缀 origin/,所以我的远程分支是 'remotes/origin/trunk'。因此,我必须使用 git diff origin/trunk HEAD。日志版本也很好:git log origin/trunk..HEAD - Zitrax

9
'git svn dcommit --dry-run' 的输出可以像下面这样再次传递给 git:
git diff-tree 2282c630eeef26fecbc3f3519be55a9dce094c80~12282c630eeef26fecbc3f3519be55a9dce094c80 -u

请注意末尾的“-u”。 然后您会看到差异。 如果您只想看到类似于“svn stat”的东西,可以使用“--stat”:
krausem-> git diff-tree f00e37882b7186e9e7f38c2fa28778e39734e2e7~1 f00e37882b7186e9e7f38c2fa28778e39734e2e7 --stat
 .../src/main/webapp/tiles/vertrag/freiKlauseln.jsp |    9 +++++++++
 1 files changed, 9 insertions(+), 0 deletions(-)

3

第二个答案(在评论中指出--dry-run不足以解决问题后进行修订)

根据您的期望,使用以下命令可能会起作用:

git log --patch --reverse --pretty=format:'%an' | awk '!a[$0]++'

git log remotes/svn.. --oneline

请注意末尾的两个句点。这将显示自上一个共享父级以来当前分支上的所有提交。在典型的 git-svn 使用情况下,这将是自上一个 dcommit 以来的所有本地提交。(这假设你的远程 SVN 分支名称为 "remotes/svn"。你可以运行 "git branch -a" 列出所有分支。)重要的是要理解这样做与直接运行它之间的区别,但也许这提供了更多你所需要的内容。

第一种回答

你可以在 dcommit 中使用 --dry-run:

git svn dcommit --dry-run

请参考这个重复的问题/答案:如何查看已经检入Git但尚未通过dcommit提交到SVN的内容?


这并没有显示任何有用的差异,只是类似于“提交到file:///svn/test1...”的内容。 diff-tree e8e4449bbf534d373694194873ea6a9ed41517bf~1 e8e4449bbf534d373694194873ea6a9ed41527be - Frank
1
我编辑了我的答案并提出了另一个想法。但需要明确的是,尽管 svn dcommit --dry-run 不易解释,但从 GIT 的角度来看,它非常精确地说明了即将提交到 SVN 的内容。 - kaliatech
看了Tomas的回答后,我意识到我不确定你实际上想要什么。是实际更改的diff,还是尚未提交的提交日志。我的答案显然提供了后者。 - kaliatech

1
当我需要开始执行git svn dcommit时,我会先打开gitk并要求它显示要传输的提交内容。
gitk git-svn..

假设你的上游 SVN 存储库真的叫做git-svn,就像Tomas 提到 的那样。如果你不确定你的上游 SVN 存储库的名字,只需启动gitk并搜索一个你没有创建的分支(听起来像 Git-SVN)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接