使用git-svn和'典型'svn repo/trunk,/ branches/...,/ tags/...如何将本地分支推送到/ branches内的新分支?
我有一个svn存储库(如果重要的话没有TLB结构)我想和git一起使用.我可以做一个git-svn克隆,在git repo中处理我的更改,并在完成后提交回svn repo.直到这一点,这一点很清楚.
我不确定如何将此工作流模型扩展到多个开发人员.我需要我的开发团队能够处理一个git repo(从svn repo克隆的那个),它应该像我们所有人的普通git repo一样.在某些时候,任何开发人员都必须能够提交回svn repo.这可能吗?谢谢.
我们最近将SVN服务器从一个数据中心移动到另一个数据中心,并且服务器的IP已经改变.我曾经svn switch --relocate old_url new_url更新过我的实际工作副本,这很开心.
但是,我在存储库的本地git版本中完成了大部分工作(显然使用git-svn).移动SVN服务器后,我更新了repo的URL .git/config,但是当我尝试使用时dcommit,我收到此错误:
Unable to determine upstream SVN information from HEAD history.
Perhaps the repository is empty. at /home/me/libexec/git-core/git-svn line 520.
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
我很困惑,我已经阅读了几篇帖子,博客和文章,不知道去哪里.我正在使用一个svn服务器repo,我用git svn下拉并继续工作.我目前是唯一一个开发此项目的人(即没有上游变更).
所以我有一个本地的git主题分支vacation,我需要合并回master到dcommit,但我不想将所有提交压缩成一个大的.
我试着做一个git rebase -i master,它删除了我90%的变化.
我做了吗
git checkout master
git rebase vacation
git svn docmmit
Run Code Online (Sandbox Code Playgroud)
或者a
git checkout vacation
git rebase master
git checkout master
git merge vacation --ff-only
git svn docmmit?
Run Code Online (Sandbox Code Playgroud)
我害怕那样b/c我以前尝试过的事情可以请一些人简单解释我应该做什么以及为什么我必须这样做?
我正在使用 git-svn 来跟踪具有多个分支的 svn 存储库。我一直在使用的服务器分支之一已在 svn 存储库中重命名。Git-svn 似乎不明白发生了什么。我怎么能告诉 git-svn 发生了什么?
我们有一个非标准的subversion存储库,我们想要转换为Git.问题是我真的不知道从哪里开始,以确保我们保持完整的历史,但最终不会完全混乱.
我们的存储库拥有我们公司产品套件的最近6年历史,并经历了多次重组.在所有情况下,我们都有一个核心平台代码库,然后是几个项目/插件,它们以不同的方式组合在核心平台之上.
前几年的结构如下:
-- plugin1
- trunk
- branches
- tags
-- pluginX
- trunk
- branches
- tags
-- trunk (core platform)
- <various sub dirs)
-- branches (various feature branches of the entire repository)
- refactoring1
- refactoringX
-- tags (various tags of customer releases of full respository)
- customerX_1.x
-- vendor (vendor drops and tracking of 3rd party source deps)
- 3rd_party_code_A
- 3rd_party_code_X
Run Code Online (Sandbox Code Playgroud)
随着时间的推移,我们添加了几个目录,包括:
-- releases (replaced tags; branches for released stable versions of repos)
-- …Run Code Online (Sandbox Code Playgroud) 我正在使用带有 SVN 存储库的 Git SVN 插件,每次我执行 git fetch 时,它都会获取整个 SVN 存储库中的所有分支更改。几个小时后需要很长时间才能在许多分支上进行多次提交
我可以告诉它仅获取特定分支的更改吗?
我使用了一个SVN存储库克隆到一个git存储库git svn clone.在那个时间点,我在该网站上没有用户名,因此没有使用该--username选项clone.因为我现在可以使用我的新用户名提交到SVN存储库,我想添加该用户名.没有它,dcommit就会失败:
% LANG=C git svn dcommit
Committing to <THE URL> ...
RA layer request failed: Server sent unexpected return value (405 Method Not Allowed) in response to MKACTIVITY request for '/svn/!svn/act/0ceca4c5-f7b4-4432-94be-0485559a6040' at /usr/lib/git-core/git-svn line 945.
Run Code Online (Sandbox Code Playgroud)
有没有办法告诉git有关新用户名?该混帐svn的手册似乎并没有帮助:增加一个用户名只能在init和branch.我不知道git如何在内部使用SVN,但我想应该有一种方法可以在之后添加用户名.
请注意,我通过http使用SVN.
我和我的团队伙伴正努力让我们的svn存储库与我们的git存储库保持同步.我们正在开发一个项目,我们被要求在svn存储库(由assembla.com网站托管)上共享我们的代码.由于我们习惯使用git对我们的代码进行版本控制,因此我们决定充分利用git提供的git svn功能.为了分享我们的所有工作并将其分成正确的分支,我们还有一个远程存储库用于git(bitbucket).
到目前为止,我们使用git承诺的所有工作都没有给我们带来任何问题,但是在错误出现后同步svn存储库错误.
我按照这个答案将现有的git存储库推送到SVN以将svn存储库连接到git,但是在几次合并和提交之后,我收到了错误,我无法再拒绝更改.
现在我有一个分支,它是svn/trunk的副本
$ git checkout -b assembla_copy -t svn/trunk
Branch assembla_copy set up to track local ref refs/remotes/svn/trunk.
Switched to a new branch 'assembla_copy'
$ git svn rebase svn/trunk
Current branch assembla_copy is up to date.
Run Code Online (Sandbox Code Playgroud)
要与我的主分支同步它我都试图
git merge master
Run Code Online (Sandbox Code Playgroud)
和
git rebase master
Run Code Online (Sandbox Code Playgroud)
但是,当git rebase master开始应用自第一次提交以来的所有更改并提供大量冲突时(当我已经在svn/trunk中进行了此更改时,因为在某种程度上我设法将一些更改推送到在线存储库;我们是(目前为r r46),git merge master顺利但是当我提交时,所有的更改都只在一个提交中总结,它表明"合并分支'主人'成为assembla_copy",而我宁愿它将所有单独的提交提交(就像它在开始时那样......).
如果我从主分支中提交,则所有提交都是分开的,但是主分支是重新分配的,因此所有具有主提交作为父分支的分支显示为与主分支分开的分支.
您能否向我解释一下正确的工作流程,以便拥有一个镜像git存储库的svn存储库,其中所有工作都已完成(svn只是一个副本)? 您是否可以使用标准的git命令而不是复杂的bash脚本,就像我在上周搜索解决方案时在一些答案中看到的那样?
谢谢!
我创建了一个简单的脚本来迁移相当大的SVN存储库.而不是使用git svn clone,我正在使用git svn init,git svn fetch以便我可以指定修订并通过块获取它的块.或多或少,它是这样的:
while [ "$CURRENT_REVISION" -lt "$MAX_REVISION" ]; do
END_REVISION=$((CURRENT_REVISION + 100))
if [ "$END_REVISION" -ge "$MAX_REVISION" ]
then
END_REVISION=$MAX_REVISION
fi
git svn fetch -r "$CURRENT_REVISION":"$END_REVISION" --authors-file="$AUTHORS_FILE"
#increasing the current and end revision
CURRENT_REVISION=$END_REVISION
END_REVISION=$((CURRENT_REVISION + 100))
done
Run Code Online (Sandbox Code Playgroud)
但是,据我所知,默认情况下,fetch/clone的行为不会保留空目录.因此,我可能需要手动签入那些空目录(*我试图避免).
有一个--preserve-empty-dirs参数,git svn clone但没有git svn fetch.
是否有任何解决方法可以解决这个问题?
UPDATE
即使在官方文档中没有提到我们可以使用配置键进行获取,它实际上是有效的
@Vampire有关于这个问题的详细解释.所以我会简化这个.
在执行init存储库之后,我不得不更改远程分支的配置:
git config svn-remote.<remote name>.preserve-empty-dirs "true"
git config svn-remote.<remote name>.placeholder-filename ".gitkeep"
您可以通过查看/.git/config来验证配置.只需执行普通提取,您的目录就会被保留.