m-git 2.5.5 → 2.5.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +16 -42
- data/lib/m-git/command/init.rb +1 -1
- data/lib/m-git/command/push.rb +2 -2
- data/lib/m-git/foundation/constants.rb +2 -1
- data/lib/m-git/foundation/mgit_config.rb +1 -1
- data/lib/m-git/hooks_manager.rb +1 -1
- data/lib/m-git/manifest/light_repo.rb +3 -0
- data/lib/m-git/manifest/light_repo_generator.rb +2 -1
- data/lib/m-git/manifest/linter.rb +1 -1
- data/lib/m-git/plugin_manager.rb +4 -3
- data/lib/m-git/repo/sync_helper.rb +41 -0
- data/lib/m-git/version.rb +1 -1
- data/m-git +1 -1
- metadata +21 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 77220cb1407e06eff83ee8f4fe617c34355301b5928ce67d4c82c0ae23402d4c
|
4
|
+
data.tar.gz: 93a2f2eafc405eab27aaf420967e7a791c6e62baeba93e6c35efc847822d5b57
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e0d257a7e6844cffbae5af66ed7584b7c828236555967101188eaf283e0591498a6c8494cefa2d5a492bef9692d6f51dd4450e28cc0c549e026af8cbeb7604e4
|
7
|
+
data.tar.gz: ead3235aae1f1f720da6ae6466107393f74e7668990fcc649aa8f8157e81a04af6610a112fdb204b213f86d596293864f2f04193d9d3ab0457335271f5c25c7d
|
data/README.md
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
# MGit
|
2
2
|
|
3
|
-
MGit
|
4
|
-
适合于在多个仓库中进行关联开发的项目,提高
|
3
|
+
MGit是一款ruby封装的基于Git的多仓库管理工具,可以高效的、同时的对多个Git仓库执行Git命令。
|
4
|
+
适合于在多个仓库中进行关联开发的项目,提高git操作的效率,避免逐个执行Git命令带来的误操作风险。
|
5
5
|
|
6
6
|
- **易用的命令**
|
7
|
-
封装
|
7
|
+
封装Git命令,命令和参数均由Git衍生而来,会使用Git就可以成本低上手MGit。
|
8
8
|
|
9
9
|
- **直观高效的执行命令**
|
10
10
|
提供图表化的结果展示,开发者可以快速查看命令在多个仓库的执行结果;
|
@@ -12,20 +12,20 @@ MGit 是一款 Ruby 封装的基于 Git 的多仓库管理工具,可以高效
|
|
12
12
|
|
13
13
|
- **安全的执行命令**
|
14
14
|
在执行命令前对多仓库状态进行安全检查:分支是否异常,工作区是否未提交代码等;
|
15
|
-
|
15
|
+
对.git进行托管与Git工作区分类,避免误删丢失改动或提交;
|
16
16
|
执行存在风险的操作时,会给与风险操作提示,避免误操作;
|
17
17
|
|
18
18
|
- **方便扩展**
|
19
|
-
支持加载
|
20
|
-
快速的扩展
|
21
|
-
提供类似`git hook`的 hook
|
19
|
+
支持加载ruby-gem包作为插件,gem包名格式 `m-git-${suffix}`和`mgit-${suffix}`
|
20
|
+
快速的扩展MGit的命令,增加自定义命令,扩展已有命令的功能;
|
21
|
+
提供类似`git hook`的 hook点,方便开发者实现自定义逻辑;
|
22
22
|
|
23
23
|
## 快速开始
|
24
|
-
#### 1、安装
|
24
|
+
#### 1、安装MGit工具
|
25
25
|
|
26
26
|
环境要求:
|
27
27
|
|
28
|
-
- 系统:支持 macOS、Ubuntu,暂时不支持
|
28
|
+
- 系统:支持 macOS、Ubuntu,暂时不支持 window-
|
29
29
|
- Ruby版本: >= 2.3.7
|
30
30
|
|
31
31
|
```ruby
|
@@ -38,45 +38,21 @@ $ gem install m-git
|
|
38
38
|
|
39
39
|
类似于 Git 从远程 clone 新仓库, 会将多个仓库 clone 到本地;
|
40
40
|
|
41
|
-
下面通过一个
|
41
|
+
下面通过一个demo体验一下MGit命令:
|
42
42
|
|
43
43
|
```ruby
|
44
44
|
# 2.1 建议在一个新文件夹中拉取demo
|
45
45
|
$ mgit init -g https://github.com/baidu/m-git.git
|
46
46
|
|
47
47
|
# 2.2 体验一下mgit命令
|
48
|
-
$ mgit -l 显示所有
|
48
|
+
$ mgit -l 显示所有migt管理的仓库
|
49
49
|
$ mgit branch --compact 查看多仓库的分支
|
50
50
|
$ mgit status 产看仓库分支超前/落后情况
|
51
51
|
```
|
52
52
|
|
53
53
|
|
54
|
-
#### 3、已有多仓库如何迁移到 MGit 管理
|
55
54
|
|
56
|
-
|
57
|
-
|
58
|
-
将要管理的仓库都配置到 manifest.json 中
|
59
|
-
|
60
|
-
- 将 manifest.json 放到一个仓库中管理
|
61
|
-
|
62
|
-
这个仓库同样会在 manifest.json 中描述,并且需要配置 "config-repo": true
|
63
|
-
|
64
|
-
这个仓库称为配置仓库,也叫做**主仓库**,其他仓库叫做**子仓库**
|
65
|
-
|
66
|
-
- 使用 `mgit init -f manifest文件路径` 初始化多仓库,命令测试 manifest.json 配置是否正常
|
67
|
-
|
68
|
-
注意这个命令不会重复拉取主仓库,只会拉取所有的子仓库到当前目录,并在当前目录创建一个.mgit
|
69
|
-
|
70
|
-
你可以在当前目录中看到每个仓库的源码,他们的路径可以通过 manifest.json 的 dest字段配置
|
71
|
-
|
72
|
-
你也可以在 .mgit/source-git/ 下看到所有仓库的.git, 这是 MGit 对所有仓库的托管
|
73
|
-
|
74
|
-
- 本地测试成功后,你可以提交主仓库中的 manifest.json,推送主仓库的变更到远端
|
75
|
-
|
76
|
-
- 通过 `mgit init -g 主仓库地址` 命令初始化多仓库
|
77
|
-
|
78
|
-
|
79
|
-
#### 4、进一步了解 MGit
|
55
|
+
#### 3、进一步了解MGit
|
80
56
|
|
81
57
|
[常用命令](docs/use/common-commands.md)
|
82
58
|
|
@@ -84,26 +60,24 @@ $ mgit status 产看仓库分支超前/落后情况
|
|
84
60
|
|
85
61
|
[配置多仓库](docs/config/config-env.md)
|
86
62
|
|
87
|
-
[使用 MGit 管理多仓库的案例](docs/use/how-to-start.md#4-mgit-)
|
88
|
-
|
89
63
|
[了解更多](docs/references.md)
|
90
64
|
|
91
65
|
|
92
66
|
## 测试
|
93
67
|
|
94
68
|
单测在MGit仓库内的test文件夹下
|
95
|
-
新建单测文件,必须以‘test_
|
69
|
+
新建单测文件,必须以‘test_’开头,
|
96
70
|
执行单测:rake (如果报错尝试执行 bundle install)
|
97
71
|
|
98
72
|
|
99
73
|
## 如何贡献
|
100
74
|
|
101
|
-
欢迎开发者向
|
75
|
+
欢迎开发者向MGit贡献代码。如果您开发了新功能或发现了bug,欢迎给我们提交PR。
|
102
76
|
|
103
77
|
代码贡献要求:
|
104
78
|
1. 功能和实现应该具有通用性, 不是为了解决某个具体业务而定制的代码逻辑
|
105
|
-
2. 代码质量高,符合
|
106
|
-
3. 需要补充对应的单测
|
79
|
+
2. 代码质量高,符合Ruby编码规范
|
80
|
+
3. 需要补充对应的单测case
|
107
81
|
|
108
82
|
issues贡献: 如在使用中遇到问题,请在 https://github.com/baidu/m-git/issues 新建 issues 反馈问题。
|
109
83
|
|
data/lib/m-git/command/init.rb
CHANGED
@@ -297,7 +297,7 @@ module MGit
|
|
297
297
|
def move_project_to_root
|
298
298
|
Dir.foreach(Workspace.root) { |item|
|
299
299
|
if item != '.' && item != '..' && item != '.DS_Store'
|
300
|
-
FileUtils.mv(File.join(Workspace.root, item), @origin_root)
|
300
|
+
FileUtils.mv(File.join(Workspace.root, item), @origin_root, force: true)
|
301
301
|
end
|
302
302
|
}
|
303
303
|
FileUtils.remove_dir(Workspace.root, true) if Dir.exist?(Workspace.root)
|
data/lib/m-git/command/push.rb
CHANGED
@@ -23,10 +23,10 @@ module MGit
|
|
23
23
|
def options
|
24
24
|
[
|
25
25
|
ARGV::Opt.new(OPT_LIST[:gerrit],
|
26
|
-
info:"开启gerrit功能,如果没有对应远程分支则推送新分支,否则推送到审查分支(refs/for
|
26
|
+
info:"开启gerrit功能,如果没有对应远程分支则推送新分支,否则推送到审查分支(refs/for/**),默认#{MGIT_PUSH_GERRIT_ENABLED ? '已开启' : '未开启' }",
|
27
27
|
type: :boolean),
|
28
28
|
ARGV::Opt.new(OPT_LIST[:topic_id],
|
29
|
-
info:"指定一组变更的分类topic
|
29
|
+
info:"指定一组变更的分类topic,若未指定则自动生成,默认#{MGIT_PUSH_TOPIC_ENABLED ? '已开启' : '未开启'},开启后强制开启Gerrit功能。mgit push --topic 12345 = git push origin HEAD:refs/for/<branch>%topic=12345",
|
30
30
|
type: :string),
|
31
31
|
].concat(super)
|
32
32
|
end
|
data/lib/m-git/hooks_manager.rb
CHANGED
@@ -83,7 +83,7 @@ module MGit
|
|
83
83
|
# block
|
84
84
|
def __execute_hook_file(file_name, hook_class)
|
85
85
|
file_path = File.join(Workspace.hooks_dir, file_name)
|
86
|
-
if File.
|
86
|
+
if File.exist?(file_path)
|
87
87
|
require file_path
|
88
88
|
end
|
89
89
|
if Object.const_defined?(hook_class) && hook = Object.const_get(hook_class)
|
@@ -16,7 +16,7 @@ module MGit
|
|
16
16
|
# @return [LightRepo] 配置对象
|
17
17
|
#
|
18
18
|
def self.simple_init(name, path, url)
|
19
|
-
LightRepo.new(name, path, nil, nil, nil, url, false, false, false, false)
|
19
|
+
LightRepo.new(name, path, nil, nil, nil, nil, url, false, false, false, false)
|
20
20
|
end
|
21
21
|
|
22
22
|
def self.light_repo_with(name, config_json, parent_json)
|
@@ -30,6 +30,7 @@ module MGit
|
|
30
30
|
light_repo.commit_id = lock_info[Constants::REPO_CONFIG_LOCK_KEY[:commit_id]]
|
31
31
|
light_repo.tag = lock_info[Constants::REPO_CONFIG_LOCK_KEY[:tag]]
|
32
32
|
light_repo.branch = lock_info[Constants::REPO_CONFIG_LOCK_KEY[:branch]]
|
33
|
+
light_repo.change_ref = lock_info[Constants::REPO_CONFIG_LOCK_KEY[:change_ref]]
|
33
34
|
end
|
34
35
|
light_repo.url = __parse_url(config_json, parent_json)
|
35
36
|
|
@@ -12,7 +12,7 @@ module MGit
|
|
12
12
|
def lint_manifest_path(path)
|
13
13
|
manifest_name = Constants::CONFIG_FILE_NAME[:manifest]
|
14
14
|
|
15
|
-
if !File.
|
15
|
+
if !File.exist?(path)
|
16
16
|
if File.symlink?(path)
|
17
17
|
terminate!("配置文件软链接#{path}失效,请执行\"mgit config -m <new_path>/manifest.json\"更新!")
|
18
18
|
else
|
data/lib/m-git/plugin_manager.rb
CHANGED
@@ -59,7 +59,7 @@ module MGit
|
|
59
59
|
with_name ||= plugin_root
|
60
60
|
glob = "#{plugin_prefix}_plugin#{Gem.suffix_pattern}"
|
61
61
|
glob = File.join(plugin_root, '**', glob)
|
62
|
-
plugin_files = Dir[glob]
|
62
|
+
plugin_files = Dir[glob]
|
63
63
|
return if loaded_plugins[with_name] || plugin_files.nil? || plugin_files.empty?
|
64
64
|
safe_activate_plugin_files(with_name, plugin_files)
|
65
65
|
loaded_plugins[with_name] = plugin_files
|
@@ -70,6 +70,7 @@ module MGit
|
|
70
70
|
def self.load_gem_plugins(plugin_prefix)
|
71
71
|
glob = "#{plugin_prefix}_plugin#{Gem.suffix_pattern}"
|
72
72
|
gem_plugins = Gem::Specification.latest_specs.map do |spec|
|
73
|
+
spec = spec.to_spec unless spec.is_a?(Gem::Specification)
|
73
74
|
matches = spec.matches_for_glob(glob)
|
74
75
|
[spec, matches] unless matches.empty?
|
75
76
|
end.compact
|
@@ -91,7 +92,7 @@ module MGit
|
|
91
92
|
message << "\n#{exception.class} - #{exception.message}"
|
92
93
|
message << "\n#{exception.backtrace.join("\n")}"
|
93
94
|
message << "\n---------------------------------------------\n"
|
94
|
-
warn message
|
95
|
+
warn message
|
95
96
|
false
|
96
97
|
end
|
97
98
|
|
@@ -104,7 +105,7 @@ module MGit
|
|
104
105
|
message << "\n#{exception.class} - #{exception.message}"
|
105
106
|
message << "\n#{exception.backtrace.join("\n")}"
|
106
107
|
message << "\n---------------------------------------------\n"
|
107
|
-
warn message
|
108
|
+
warn message
|
108
109
|
false
|
109
110
|
end
|
110
111
|
|
@@ -134,6 +134,8 @@ module MGit
|
|
134
134
|
return sync_tag(repo, light_repo)
|
135
135
|
elsif !light_repo.branch.nil?
|
136
136
|
return sync_branch(repo, light_repo)
|
137
|
+
elsif !light_repo.change_ref.nil?
|
138
|
+
return sync_change_ref(repo, light_repo)
|
137
139
|
end
|
138
140
|
end
|
139
141
|
|
@@ -210,6 +212,45 @@ module MGit
|
|
210
212
|
|
211
213
|
end
|
212
214
|
|
215
|
+
# 同步 change ref
|
216
|
+
#
|
217
|
+
# @param repo [Repo] Repo对象
|
218
|
+
#
|
219
|
+
# @param light_repo [Manifest::LightRepo] LightRepo对象
|
220
|
+
#
|
221
|
+
# @return [Boolean] 执行结果,成功返回nil,错误返回错误信息
|
222
|
+
#
|
223
|
+
def sync_change_ref(repo, light_repo)
|
224
|
+
current_branch = repo.status_checker.current_branch(strict_mode:false)
|
225
|
+
local_branch_exist = repo.status_checker.local_branch_exist?(light_repo.branch)
|
226
|
+
remote_branch_exist = repo.status_checker.remote_branch_exist?(light_repo.branch)
|
227
|
+
is_dirty = repo.status_checker.status == Status::GIT_REPO_STATUS[:dirty]
|
228
|
+
|
229
|
+
# 当前已在目标切换分支则不操作
|
230
|
+
if current_branch == light_repo.branch
|
231
|
+
return nil
|
232
|
+
# 本地或远程存在目标分支则切换
|
233
|
+
# elsif local_branch_exist || remote_branch_exist || Utils.branch_exist_on_remote?(light_repo.branch, light_repo.url)
|
234
|
+
|
235
|
+
else
|
236
|
+
# return "仓库change_ref \"#{light_repo.change_ref}\"不存在,请检查是否拼写错误!"
|
237
|
+
# 本地无目标分支则先拉取
|
238
|
+
if !local_branch_exist && !remote_branch_exist
|
239
|
+
success, error = repo.execute_git_cmd('fetch origin', light_repo.change_ref)
|
240
|
+
puts error
|
241
|
+
return error if !success
|
242
|
+
end
|
243
|
+
|
244
|
+
if !is_dirty
|
245
|
+
success, output = repo.execute_git_cmd('checkout', 'FETCH_HEAD')
|
246
|
+
puts output
|
247
|
+
return output if !success
|
248
|
+
else
|
249
|
+
return "本地有改动, 无法切换到\"#{light_repo.change_ref}\", 请处理后重试!"
|
250
|
+
end
|
251
|
+
end
|
252
|
+
end
|
253
|
+
|
213
254
|
# 同步remote url
|
214
255
|
#
|
215
256
|
# @param repo [Repo] Repo对象
|
data/lib/m-git/version.rb
CHANGED
data/m-git
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
mgit
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: m-git
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.5.
|
4
|
+
version: 2.5.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- zhangyu81
|
8
8
|
autorequire:
|
9
9
|
bindir: "./"
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-10-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: colored2
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0.12'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: logger
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 1.4.2
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 1.4.2
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: bundler
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -70,16 +84,16 @@ dependencies:
|
|
70
84
|
name: rake
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
72
86
|
requirements:
|
73
|
-
- - "
|
87
|
+
- - "~>"
|
74
88
|
- !ruby/object:Gem::Version
|
75
|
-
version:
|
89
|
+
version: '10.0'
|
76
90
|
type: :development
|
77
91
|
prerelease: false
|
78
92
|
version_requirements: !ruby/object:Gem::Requirement
|
79
93
|
requirements:
|
80
|
-
- - "
|
94
|
+
- - "~>"
|
81
95
|
- !ruby/object:Gem::Version
|
82
|
-
version:
|
96
|
+
version: '10.0'
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: minitest
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -211,7 +225,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
211
225
|
- !ruby/object:Gem::Version
|
212
226
|
version: '0'
|
213
227
|
requirements: []
|
214
|
-
rubygems_version: 3.
|
228
|
+
rubygems_version: 3.4.13
|
215
229
|
signing_key:
|
216
230
|
specification_version: 4
|
217
231
|
summary: A multi-repository management tool integrated with git.
|