2014-09-02 49 views
0

我们有我们的SVN代码,但现在切换到Git的。揭露一个Git仓库作为公共克隆的唯一部分,但具有完全的历史

问题是,我们有这样的文件夹:

/src/com/something/main 
/src/com/something/dev 

和Eclipse源文件夹设置为/src

只有代码,在包.../main必须成为公众。在包.../dev

代码是未完成的和私人。

.../dev中的代码完成后,我们将该类移动到Eclipse中的.../main。这是一个不同的Java包,我们不使用分支。所以这不是合并。

我试图

git filter-branch --index-filter 
'git rm --cached --ignore-unmatch src/com/something/dev' 

但随后在移动之前所有的历史都将丢失,文件突然出现的作者是谁动完了!

如何将资源库分成两个分支:分支“秘密”拥有一切,分支“大众”在文件夹.../main所有文件的完整历史记录,即使该文件最初是在文件夹.../dev这是隐藏?

假设文件历史如下

.../dev/file1 created moved to .../main/file1 (released) 
.../dev/file2 created but not released 

那么我就需要公版显示两个提交:和.../dev/file1创作的举动释放。当然还有对这个文件进行的任何编辑。 .../dev/file2的存在/历史应该只在完整的存储库中。更糟糕的是:一些提交的修改file1file2,但只有file1发布。

混帐是否允许呢?有一个“秘密”分支,但是当从秘密分支推送文件到主分支时,所有的历史记录也会被移动?还是它提交最终文件(没有历史记录)来发布分支?文件重命名似乎也很不好支持。它如何处理未被推送的相同提交中的其他文件?是否有一个git命令提交一个file1分支“公共”只有这个文件的所有历史,而不是其他文件在同一个提交?

+0

看看[这](http://nvie.com/posts/a-successful-git-branching-model/) – pratZ 2014-09-02 17:14:12

+0

我不问如何做得更好。我有1000个修订我需要转换。 – 2014-09-02 19:14:34

回答

0

简短的回答是git mv dev /src/com/something/dev /src/com/something/main。这保留了历史。但你不想保留所有的历史,你想要一个不同的历史。所以你必须分离触及未发布文件的提交的公共部分和私有部分。而且git需要知道这个移动(从git mv或者因为它自动检测到重定位),以便有机会将旧文件的历史记录与新路径相关联。即使这个历史被修改了。

所以一个开始的问题可能是“接触/ src/com/something/dev和/ src/com/something/main的提交的交集是什么?”

git log --reverse --pretty=oneline /src/com/something/main /src/com/something/dev >combined_commits.log 
git log --pretty=oneline /src/com/something/dev >dev_commits.log 
git log --pretty=oneline /src/com/something/main >main_commits.log 
sort main_commits.log dev_commits.log | uniq -d >bad_history.log 

因此,最终列表中的所有提交都触及两者(但不是原始的,即combined_commits.log顺序)。没有一个命令可以做你想做的事情,但你可以对它进行编写。松散的算法是:

git的变基-i $ {} EARLIEST_CONFLICT_HASH〜1

马克 “编辑” 对所有的坏提交,如:

... 
pick c6d108f Auto-detect catkey vs. barcode 
pick 8616c0e Directory cleanup 
edit ae885c6 Move registration url to '/register' 
pick af5394f Initiate workflow on registration 
... 

保存/退出。然后,在每个“编辑”阶段:

git commit /src/*/*/dev # commit dev stuff separately first 
git add /src/*/*/main  
git rebase --continue 
+0

这些文件早已被移动。 'git mv'不能帮助我,我不会重播1000次修改,而是亲自动手。 – 2014-09-02 19:13:39