2010-06-29 53 views
12

我正在使用来自OpenSource项目的代码的项目。其中一个要求是尽可能多地将代码推回到上游。与SVN上游同步工作

远程项目使用Subversion(不是很好)。

我目前的设置是这样的:

[Remote SVN] (git svn fetch)-> [My public Git] <-(push/pull)-> [My dev. Git] 
            VV 
            (pull) 
            VV 
           [Testing grid] 

EDIT 11.7。 - 重新提出了问题

我的问题是我的本地公共回购和svn上游并存。

我必须提供3个公共分支:

  • 保守稳定
  • 实验稳定
  • 发展

这些分支现在是线性的(发展成为实验稳定和实验变得保守) ,但目标是合并的标准3头方法。由于它们的公共性质,我不能重新分配这些分支。

现在完全正交于此我试图以某种方式使向上游发送补丁更容易。从我的分支挖出它们很慢并且容易出错。

我目前典型的工作流程是:

  • 落实在上面开发分支的一些功能
  • 测试&修复功能
  • 测试&解决这个新特性(实际上发生了很多)
  • 破碎等特点
  • 确定这是否可以在上游接受或不接受(30:60是:否)
  • 对此做些事情(我们只是写一个新的TODO)

上游的另一个问题是,他们接受补丁到不同的分支(我的公共分支是基于他们的稳定分支)。一旦补丁达到稳定分支,我可以简单地忘记它们存在,但在这种情况发生之前,我需要将它们保留在本地。

+1

你的任务看起来类似于这个http://hgbook.red-bean.com/read/advanced-using-of-mercurial-queues.html。通过由“Mercurial Queues”管理的补丁堆栈解决。不知道是否有这样的工具git – Alsk 2010-07-15 11:05:49

+0

@Alsk这确实看起来很相似。谢谢你的提示。 – 2010-07-15 20:50:08

回答

28

git svn documentation与Subversion分支打交道时,建议采用以下流程:

# Clone a repo (like git clone): 
git svn clone http://svn.example.com/project -T trunk -b branches -t tags 

# Append svn:ignore settings to the default git exclude file: 
git svn show-ignore >> .git/info/exclude 

# View all branches and tags you have cloned: 
git branch -r 

# Create a new branch in SVN 
git svn branch waldo 

# Reset your master to waldo: 
git reset --hard remotes/waldo 

# local changes 
git add ... 
git commit ... 

# pull changes on current branch 
git svn rebase 

# send changes to Subversion 
git svn dcommit 

# check for new branches 
git svn fetch

上面的工作流程是在一个单一的Subversion分支,你有一个提交位的豪华不间断的变化,但杂耍多活跃的Subversion和git分支有点棘手。

要跟踪Subversion版本库的金都分公司,

git checkout -b waldo-svn remotes/waldo

的-svn后缀开始是为了避免形式的警告

warning: refname 'waldo' is ambiguous.

,也提醒大家,这个混帐分支用于跟踪Subversion分支。始终保持对这些分支线性的更改!

要更新瓦尔多 - SVN,运行

git svn rebase

这将获取从Subversion的变化,底垫在这些之上的修改。它也足够聪明,可以识别当你的本地更改被逐字上游接受时:它将被Subversion提交替代,并在其提交消息中有一行以git-svn-id: ...开头。

当上游维护者改变的内容和你的补丁的结构(例如,修改代码,分割补丁成多个的Subversion提交,或多个补丁组合成单个提交)是当生活变得有趣解决冲突和试图解开混乱。

为了保持一般性,请将您的-svn分支保存在git中(不要更改),并创建问题分支以关闭-svn分支。要发送一个补丁,使用

git diff waldo-svn waldo-fix-frobnicator

然后,当你git svn rebase赶上颠覆回购,你需要查看日志和混帐决定您的问题分支各自的性格,排序的GTD

+3

+1“让你的树枝干净”。它们本质上不是*你的* svn分支,它们是上游分支,因此它们必须作为单独的分支坚持在本地Git存储库中。如果这样,你可以像Git上游分支一样使用它们。 – 2010-07-11 06:28:40

+1

Thx这样长的回答gbacon。但那不是我遇到的问题。我已经重新提出了这个问题,希望现在会更清楚。 – 2010-07-11 08:37:34

+2

'-T trunk -b branches -t tags'的简单同义词是'-s'。 – l0b0 2012-04-16 10:54:57

1

我不太确定我是否了解您的问题,但我认为您可能正在寻找git stash

+0

感谢这会有所帮助,但它不是解决整个问题的方法。 – 2010-06-29 13:50:02

1

我不确定您的功能与上游代码的耦合程度有多高,但您可能会将上游的“核心”与您的功能添加区分开来。这只有在你能够对代码库进行分区时才有效。

+0

那么,我做的代码分区。我将代码的一部分保持与基本完全脱节,因为针对此代码的补丁数量使得上游错误修正无关紧要。 问题是代码的其余部分。 – 2010-06-29 13:51:12

0

你真的没有说清楚你想做什么。关于你的陈述,“(为每个特征维护单独的分支因此是非平凡的)”,我只能想知道为什么你认为它应该是微不足道的。两个互相依赖的补丁应该是单个补丁,或者至少在一个分支上。依赖于A的修补程序B(但不是另一种方式)应该在具有A的分支上,或者在具有A分支上的父承诺的分支上。

现在,如果你想保持你的补丁上游位置的“清晰概览”,这将归结为保留所有上游分支的本地副本。我没有看到问题出在哪里。如果你想得到更准确的答案,你确实需要精确。


好的,现在更容易处理。

你有两个问题。 (1)得到的fork提交永远不会从你的主开发分支上游转移到fork分支,一旦你意识到你永远不会发送它们。

做一个分支。一旦你意识到一个功能不会回来,从保持叉功能的分支拉。然后git revert叉功能应用修补程序,从local- *撤消功能。根据需要重复。

(2)你是在担心上游补丁发生了什么。

你真的不应该追踪他们是否已经将你的补丁应用于远程稳定(从此以后稳定的)。如果您从r-stable拉出并且尚未应用该补丁,则不会丢失L稳定中的补丁。唯一可能的问题是补丁中的代码会产生合并冲突,但是你无法解决这个问题。一旦他们应用了这个补丁,它将看起来与你解决合并冲突的方式完全相同(在这种情况下,当你从R-stable中抽取补丁时,你将得不到这个补丁),否则他们会以不同的方式合并,你会得到合并冲突,并有机会决定保持自己的方式或你的方式。只要记住,如果你想保持自己的方式,你会从r稳定分叉。一种选择是将您的方式转移到叉子上,并保留在本地*上。

+0

我再次重新提出了这个问题。希望现在会清楚。 – 2010-07-11 08:35:46