用于使git-svn简单的命令行工具
项目描述
git-svn-helpers是一组命令行工具,极大地简化了使用git对svn仓库的操作。
其主要目标是使在现有的svn检出后设置本地git仓库变得非常简单。
它还解决了使用单个git-svn仓库处理多个检出(通常是不同分支)并在它们之间切换的问题。
基本用法
执行摘要
> cd path/to/svn/repo > gitify init
执行本地更改并将其提交到git。当准备好推送更改时
> gitify push
以更新工作目录的上游更改
> gitify update
gitify将确保您的git和svn仓库保持同步,并在更新时尽力避免冲突。
示例会话
以下是一个示例会话
> cd /tmp > svn co https://svn.plone.org/svn/plone/plone.app.form/branches/1.1 plone.app.form A 1.1/setup.py ... Checked out revision 27228. > cd plone.app.form > gitify init No git repository found in /Users/tomster/.gitcache/. Initiating cloning into cache. Analyzing svn log... Cloning https://svn.plone.org/svn/plone/plone.app.form/ from r10593:34543 into /Users/tomster/.gitcache/ Initialized empty Git repository in /Users/tomster/Development/gitcache/plone.app.form/.git/ ... Git branch 'local/1.1' is now following svn branch '1.1': # On branch local/1.1 nothing to commit (working directory clean) > git branch * local/1.1 master
注意事项
gitify限制了克隆到包根目录(在此处为https://svn.plone.org/svn/plone/plone.app.form/)中SVN日志中找到的修订版本。这可以节省大量时间,尤其是在大型仓库(如plone.collective)中。
gitify创建了一个名为local/1.1的本地分支,该分支跟踪(远程)SVN分支1.1,并将其切换到该分支。
gitify假设包的名称是从其被调用的目录的名称(在此例中为plone.app.form),因为它拒绝猜测。
同一包的多重签出
在实践中,您通常会处理给定仓库的不同本地副本,即在主分支和功能分支上。这时,上面创建的.gitcache目录就派上用场了。让我们将之前的签出移除,并创建一个维护签出,该签出跟踪主分支。
> cd .. > mkdir feature-branch > mv plone.app.form feature-branch/ > mkdir maintenance > cd maintenance/ > svn co https://svn.plone.org/svn/plone/plone.app.form/trunk plone.app.form A plone.app.form/setup.py ... U plone.app.form Checked out revision 27228.
如果我们在这里运行gitify会发生什么?
> cd plone.app.form/ > gitify init Updating existing cache: fetching /Users/tomster/.gitcache/plone.app.form Done. 1 packages updated. Git branch 'local/trunk' is now following svn branch 'trunk': # On branch local/trunk nothing to commit (working directory clean)
请注意,这个操作的速度要快得多,因为我们现在已经使用了缓存目录中现有的git仓库,从而避免了缓慢且网络密集的克隆操作。
这一点可以通过查看现在可用的本地分支进一步证明。注意git仓库中包含主分支和1.1分支。
> git branch local/1.1 * local/trunk master
切换分支
如果SVN仓库切换到另一个分支(例如,由于svn:externals或buildout源中的更改),则git所在的分支与当前的SVN分支不同。要解决这个问题,您可以选择手动切换git或重新运行gitify init。
> svn info URL: https://svn.plone.org/svn/plone/plone.app.form/trunk > git branch local/1.1 * local/trunk master
如果切换SVN分支,git最初不会捕获更改,分支将不同。
> svn switch https://svn.plone.org/svn/plone/plone.app.form/branches/1.1 > svn info URL: https://svn.plone.org/svn/plone/plone.app.form/branches/1.1 > git branch local/1.1 * local/trunk master
重新运行gitify init后,它们将再次相同。
> git branch * local/1.1 local/trunk master
保持缓存更新
当然,一旦您引入了缓存,您需要保持其更新。《span class="docutils literal">git-svn》提供了fetch命令用于此目的。实际上,手动更新每个包是非常麻烦的。因此,我们提供了自己的fetch命令,该命令可以使用通配符一次更新多个包,如下所示:
> gitify fetch plone* fetching /Users/tomster/.gitcache/plone.app.form fetching /Users/tomster/.gitcache/plone.pony fetching /Users/tomster/.gitcache/plonenext Done. 3 packages updated.
您可以将-v选项传递给查看git-svn fetch命令的输出。如果不提供包,则更新所有包。
请注意,我们的fetch命令永远不会触摸任何工作副本,只触摸缓存。它主要是作为维护命令运行的,即通过crontab来保持本地缓存“新鲜”。
保持git和svn同步
由于本地文件系统同时是git仓库以及SVN签出(换句话说,我们同时有.git和.svn),因此它们应尽可能保持同步。按照设计,这只能在我们有在线访问SVN仓库的情况下发生。因此,最好在提交回SVN时执行此操作。手动执行此操作的方法是首先执行dcommit,然后执行svn up --force命令(--force是必要的,这样SVN就不会被已提交的新文件打扰)。gitify push提供了一个方便的命令,可为您执行此操作。
> gitify push -v Committing to https://svn.plone.org/svn/plone/plone.app.form/branches/1.1 ... At revision 27229. INFO: Pushed local changes to svn. > svn st <BLANKLINE>
安装
只需使用easy_install,可选地使用virtualenv
> easy_install git-svn-helpers
需求
git-svn-helpers要求已经安装了git(带有子版本控制支持,即git-svn)。
待办事项
添加对自定义SVN布局的支持
变更历史
0.9 - 2012-03-11
规范仓库现在在https://github.com/collective。 [rossp]
修复切换到git已经本地分支的svn分支时的处理方式。[rossp]
0.8 - 2010-03-10
如果svn仓库已被切换到另一个分支,则使init命令跟随。感谢Calvin Hendryx-Parker报告此问题。[tomster]
0.7 - 2010-03-07
使用完整副本而不是符号链接来创建工作副本。这避免了在处理同一仓库的多个副本时git和svn仓库不同步的问题,并大大降低了冲突风险。
这也意味着,fetch命令现在只对缓存进行操作,而不修改工作副本(例如,可以通过crontab安全运行)
对旧式工作副本运行gitify将产生错误。然而,简单地删除符号链接并重新运行gitify可以修复此问题。
另一个影响是,init命令现在只需对每个工作副本运行一次(在切换到同一仓库的不同工作副本之间不再需要重新运行该命令)。
因此,gitify不再默认使用init命令(就像git和svn在没有提供显式动作的情况下不会执行任何操作一样)。它已经被重命名为init。[tomster]
允许help、--version和fetch命令在.svn目录外运行 [tomster]
0.6 - 2010-03-07
添加文件清单,以便包括所有必要的文件以进行sdist [proyvind]
用于强制执行dcommits以帮助保持svn和git仓库同步的示例更新钩子 [chaoflow]
更新测试以与git 1.6.x兼容 [tomster]
删除了clone、fetch和commit的过时入口点 [tomster]
0.5 - 2009-08-15(即HAR2009版本)
添加了gitify update命令,它执行git-svn rebase操作,同时对当前svn检出中的未提交本地更改进行处理得很好(与git svn不同,但与svn相同)
不再使用日志模块进行用户反馈。那个想法相当有误 :)
0.4 - 2009-08-11
重构了入口点,仅使用gitify。所有其他命令现在是gitify的子命令
gs-commit已被替换为gitify push
gs-fetch已被替换为gitify fetch
为每个命令添加了用法和帮助输出。
删除了gs-clone入口点,因为它总是与主要的gitify命令一起使用。
使用适当的日志而不是仅仅打印到stdout
添加了全面的测试,包括涵盖从克隆svn仓库到提交回其的整个更新/提交周期的功能测试。
0.3.1 - 2009-07-09
BUGFIX:不要使用自定义别名,因为它们可能没有安装。这解决了http://github.com/tomster/git-svn-helpers/issues#issue/2
BUGFIX:明确列出elementtree作为依赖项。这解决了http://github.com/tomster/git-svn-helpers/issues#issue/1)
0.3 - 2009-06-09
添加了gs-commit命令,该命令有助于将更改提交回svn并保持git和svn同步
0.2b - 2009-06-05
添加了gs-fetch命令,该命令有助于保持缓存更新
0.1b2 - 2009-05-30
BUGFIX:从包根目录(即 /path/to/foo)获取svn日志,而不是本地检出路径(即 path/to/foo/branches/bar),后者通常比整个包年轻得多,因此在克隆过程中可能会错过版本!
0.1b1 - 2009-05-30
初始发布,又称“对我有效”
下载
项目详情
git-svn-helpers-0.9.tar.gz的散列值
算法 | 散列摘要 | |
---|---|---|
SHA256 | 8be63944ebe29cee0555a5da481e0fd794c2e8f3a1a89b68aa9868c4ebd7dc4c |
|
MD5 | f7d1b577096dbb4004595fa81ee4d98a |
|
BLAKE2b-256 | 2131b3c4d13f8b09f9e1a32a9a444685e63dde774540c842107495fc89767a8d |