在执行git-svn dcommit之前,是否可以压缩或编辑一些提交记录?

7
我正在一个采用严格签入策略的Subversion仓库中开展项目,该策略包括:所有对主干的提交都必须由另一位开发人员进行审核,并且这一点必须在提交信息中提到。
在使用git-svn时,我正在进行许多未经审核的增量git签入。它们的git提交信息反映了这一点。
那么,在使用git-svn的同时如何遵循svn仓库的规则才是最佳方法呢?我应该将所有提交都压缩成一个单独的svn提交吗?我能否重写每个版本的提交信息并添加审阅者信息?我可以“手动”将每个单独的更改移动到git主分支中,并在执行git-svn dcommit之前修改每个提交信息吗?
4个回答

8
我在git的分支上工作,然后切换到主分支,使用“git svn rebase”命令更新,最后将分支合并到主分支上。此时,如果我使用“git svn dcommit”提交,所有中间提交的信息都将按原样逐个提交到svn中,这并不是我们想要的!但是,如果我使用“git commit --amend”修改合并提交的消息以符合我们的svn提交策略,dcommit会将它们全部汇总为一个提交,并使用新消息。胜利。
我发现,如果主分支在分支的生命周期内没有变化,则似乎无法实现此操作。这些提交只会快速合并,并没有“合并分支”的消息,所以最好在“git merge”命令中添加“--no-ff”标志。
概要:
git checkout branch
<do work>
git checkout master
git svn rebase
git merge --no-ff branch
git commit --amend
<policy-compliant commit message>
git svn dcommit

只是为了确保我理解:在这种方法中,“master”用于提交到“svn”的提交,所有的开发和中间提交都在“branch”中。对吗? - Dror
如果在“合并”步骤中提供了一个“好”的提交消息,您就不需要进行“修正”。 - Dror
@Dror没错 - 我没有在主分支上工作。我最近没有需要使用git-svn,所以可能是git的变化使修改提交不必要了。虽然我记得当我写那个答案时还需要这样做 :) - John Y
我也是这样做的。需要注意的是,在合并和 svn dcommit 之后,rebase 将无法在分支上成功。我已经能够通过快进合并将分支再次同步:git svn merge --ff-only - DanHorner

4

你可以交互地将本地分支与Subversion跟踪分支重新基于,这将提供给您一个机会来压缩和修改提交。

下次您执行dcommit时,dcommit将一次提交一个地重放您的历史记录,这就是提交到Subversion的内容。

假设:

  1. 本地分支为master
  2. 已检出Master
  3. 远程跟踪分支的名称为git-svn
  4. git-svn是最新的

操作步骤:

$ git rebase -i git-svn

您的默认编辑器将打开一个包含与 git-svn 要 rebase 的主分支的提交列表。您可以选择、编辑或压缩提交(如果需要,可以混合匹配)。

在选择完成后,另一个临时文件将打开,其中显示正在重写的每个提交的提交消息。这里是您修改提交消息的地方。

注意事项:

您正在重写仓库的历史记录,请谨慎操作。可能值得尝试此行为,直到感到自信为止。


1
git rebase -i 是非常强大的工具。只需在分支上更改提交信息,然后继续操作即可。 - toholio

2

是的,您可以重写提交信息。是的,您可以将它们全部压缩成一个提交。这可能取决于审查流程和您一次要做多少事情。

“手动”将每个更改移动到主分支与在某种程度上重写提交消息并没有太大区别,但许多分支和挑选操作可能会很方便。

总的来说,答案是“取决于具体情况”,“Git足够灵活,可以满足您的各种需求”。


1
这可能值得一试,我是一个相对新手,但现在我正在做的是:
创建远程svn仓库的克隆副本:
# clone svn repository
git svn clone ....

创建一个普通的Git仓库(克隆克隆):
# clone the clone :)
git clone /path/to/original/clone
git checkout -b working

现在,您可以像正常的git存储库一样在第二个克隆中工作(实质上就是这样):

# commit changes, whatever you like
git ci
...

要将您的更改推回中央 SVN 存储库,请返回第一个克隆并执行以下操作:

# pull and flatten changes
git pull --squash /path/to/working/clone

--squash 参数表示将所有被拉取的提交合并为一个提交。该提交不会立即提交,因此您可以执行以下操作:

git ci
git svn dcommit  

最后一步是将所有内容推送为一个单独的提交。

编辑 - 通常情况下,我不建议在其他情况下使用--squash,但请注意,工作库保留完整的历史记录(它对压缩免疫),但您发送到上游的内容被压缩成一个干净的单个提交,这是本案例所需的。我认为这是一个合理的妥协。


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