繁体   English   中英

如何在一个工作目录中使用两个 SVN 项目和相应的 git-svn 分支?

[英]How can I use two SVN projects and corresponding git-svn branches with a single working directory?

我对 Git 比较陌生,但我想尝试一下(与 SVN 和 Bazaar 相比)。

任何人都可以向我推荐一个类似于以下情况的工作流程:

  • 1 个 SVN 存储库,包含多个项目
  • 1个工作副本“src”

想法是在“src”中我需要检查项目 A 或有时项目 B。这两个项目都有几个分支。

目前,我已经制作了 SVN 存储库的 2 个 git 克隆,每个项目一个。 (我更喜欢 --bare repos,但它不适用于git svn clone

然后,我在“src”中创建了一个 git repo,然后git remote add projA ..a_repo_git ,“ git remote add projB ..b_repo_git ”。

现在,我可以使用“git remote”从“src”查看它们,并且可以使用“git remote show projA”查看它们的分支

而现在的麻烦..

  • 我怎样才能进入 projA/projB 中的“src”任何分支?
  • 如何修改它们,然后能够将它们推回(首先到 git_repos,或直接到 SVN 存储库)?
  • 这个“工作流程”可以吗,还是你有更好的主意?

我确实在 src 中尝试过: git checkout --track -b work_branch projA branch_in_A在对“fetch”进行了一些摆弄之后,我设法得到了东西。 但是后来,我将它推回a_repo_git ,然后推回 SVN 时遇到了问题。 这主要是反复试验。

我不得不承认,我仍然有远程分支的问题! (当我必须使用“ origin local_branch:origin_branch ”或“ origin origin_branch:local_branch ”或“ origin origin_branch ”或“ origin/origin_branch ”时,我会迷路!返回 Git 手册以获取更多信息。)

我还没有更新这个问题,因为在过去的几天里,在我的新仓库的帮助下,我能够非常轻松地工作:)

这是我最后所做的:

在同一目录中初始化两个 SVN 存储库。 (我现在不记得了,但之前可能在同一个目录中完成了“git init”:

mkdir src && cd src
(not sure about this: git init)
git svn init --stdlayout --prefix=projA/ -RprojA file:///path/to/svn/repo/A
git svn init --stdlayout --prefix=projB/ -RprojB file:///path/to/svn/repo/B

“--stdlayout”表示SVN repos采用标准格式,主干、分支和标签在同一级别。

“--prefix”用于分支名称。 当我们执行“git branch -a”时,项目 A 中的所有 SVN 分支都有前缀“projA”(例如:projA/branch_name_of_A)。 B也是一样。

-R 选项在 Git 存储库中设置 SVN 存储库的名称(这是我们在引用 SVN 存储库/项目时与 Git 一起使用的名称)

file:///path 是 SVN 存储库的路径,在这种情况下是存储库中项目的路径。 我使用“file://”,因为我使用的是平面文件存储库,没有服务器。 对于 SVN 服务器,我确信它也可以与 http:// 一起使用。

在这一步之后,出于好奇,我查看了文件 src/.git/config。 上面的两个命令创建了几个“svn-remote”部分,一个用于每个项目(-R 选项),一个称为“svn”的通用部分。 我已经修改了条目,所以只有对项目的引用。 每个引用都有 repo 路径(获取)和标签/分支/主干的条目。 如果您查看该文件,您将了解需要更改的内容。

在此之后,我获取了每个项目的内容,使用

git svn fetch projA #the contents of project A repo are downloaded
git svn fetch projB #the contents of project B repo are downloaded

现在,runnig "git branch -a" 显示了来自两个 repos 的所有分支,以及 master 分支(本地)。 “git branch -r”没有显示任何分支; 可能是因为它们是“svn-remote”而不是“remote”

当前的“master”分支指向第二个项目的主干。 我决定摆脱它,因为它会在从一个项目切换到另一个项目时引起问题。

我创建了两个新分支来指向每个项目的主干,然后删除了“主”分支:

git checkout -b master_project_A projA/trunk
git checkout -b master_project_B projB/trunk
git branch -D master

现在,对于“工作流程”; 从事项目A:

git checkout master_project_A #switch to project A
git svn rebase #check for any updates on SVN repo
git checkout -b work_on_A master_project_A #create a branch starting from the master of project A

work work work on work_on_A; commit, etc

git checkout master_project_A #go back to master of project A
git svn rebase #check again for any update on SVN repo
git checkout work_on_A #go back to the work branch
git rebase master_project_A #update branch with any changes from the master of project A
git checkout master_project_A #go back to the master of project A
git merge work_on_A #merge to the master of project A the changes from the work branch
git svn dcommit #commit changes to the SVN repo, in trunk, because master_project_A was pointing to its trunk

如果我想从 SVN 中检出一个现有的分支,我可以这样做:

git checkout -b work_on_branch projA/branch_name

work work work

git svn rebase #update any changes from projA/branch_name
git svn dcommit #commit updates back to the branch in the SVN repo

对于项目 BI 可以做完全相同的事情。 最后,我可以在同一个目录“src”中拥有项目 A 或 B 的内容,并且可以从同一个 Git 存储库访问 SVN 存储库中的两个项目! :D

我还没有弄清楚如何创建一个本地分支然后将其推送到 SVN 存储库 - 我很接近,但它没有工作。

此外,了解命令“reset”(“git reset --hard projPrefix/branch”)可能很有用,但我使用它破坏了一些东西,所以最好把它留到其他时间。

让我们首先考虑一个远程仓库和一个本地仓库的简单情况。

本地存储库中的remote “仅”作为对另一个存储库的引用。 您可以使用fetch将远程对象检索到本地存储:

git remote add upstream git://...
git fetch upstream

现在可以使用upstream/branchname在本地引用和处理来自upstream的所有分支。 要真正在远程分支上工作,您应该始终创建一个跟踪远程分支的本地分支:

git checkout -b new_local_branchname upstream/branchname

现在,您可以在本地工作并随心所欲地提交/合并。 作为最后一步,您可以将更改push送回中央存储库。 重要的是 AFAIK push只能进行快进合并,即上传更改并设置新的头部。 因此,您必须准备本地分支,以便本地更改从远程分支的尖端开始。 您可以使用rebase来实现这一点,或者避免在本地工作时更改中央存储库。

这描述了两个存储库之间的简单工作流程。 现在来看 SVN 的具体情况。

git svn通过进一步限制你可以做的改变使情况复杂化。 与远程一样,您永远不应直接修改 SVN 分支,而应始终在本地分支上工作。 与远程不同, git svn总是在提交进入 SVN 存储库时修改提交以添加必要的元数据。 最后一个事实可能是造成许多问题的原因,因为 SVN 分支上的提交总是与本地分支上的原始提交具有不同的哈希值。

最后,关于同一个仓库中多个项目的问题。

Git 不支持在同一个 repo 中并行检出多个分支。 您可能希望查看子模块以集成多个存储库。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM