m-git 2.5.5 → 2.5.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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.
|