- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
"-6ren"> "-我有很多 Maven 多模块项目(大约 50 个)。每个都有 1 到 4 个子模块。每个多模块项目都位于一个单独的 git 存储库中。由于出现问题,我需要将模块拆分到单独的存储库中。 我有一个 she-6ren">
我有很多 Maven 多模块项目(大约 50 个)。每个都有 1 到 4 个子模块。每个多模块项目都位于一个单独的 git 存储库中。由于出现问题,我需要将模块拆分到单独的存储库中。
我有一个 shell 脚本,用于将文件夹(maven 模块)从存储库 A 移动到存储库 B,保留其 git 历史记录。
#!/bin/sh
# moves a folder from one git repository to another
# moveFolder <absolute repository one path> <repository one folder> <absolute repository two path>
echo "Moving "$2" from Repository: "$1" to Repository:"$3
# prepare repository one
cd $1
git clean -f -d -x
git checkout -b tmpBranch
git filter-branch -f --subdirectory-filter $2 HEAD
mkdir $2
mv * $2
git add .
git commit -a -m "CIRCLE-524: Moved "$2" into new repository"
#import in repository two
cd $3
git remote add repositoryOne $1
git pull repositoryOne tmpBranch
git remote rm repositoryOne
#cleanup
cd $1
git checkout master
git branch -D tmpBranch
当我只需要为几个项目执行此操作时,我可以手动执行。但因为我有大约 50 个多模块项目,所以我喜欢将其自动化。
我可以使用 ProcessBuilder执行这个脚本。但拆分所有模块的过程将在 Windows 机器上完成。
(当我手动执行此操作时,我使用的是 Git Bash)
所以我找到了JGit用java自动化我的整个过程。我的问题是 git filter-branch -f --subdirectory-filder $2 HEAD
到目前为止,我有以下内容。
public static void revWalk(final Git repo) throws NoWorkTreeException, GitAPIException, MissingObjectException, IncorrectObjectTypeException, IOException {
final Ref tmpBranch = checkOutBranch(repo, "tmpBranch");
final Repository repository = repo.getRepository();
try (RevWalk revWalk = new RevWalk(repository)) {
final ObjectId commitId = repository.resolve(tmpBranch.getName());
revWalk.markStart(revWalk.parseCommit(commitId));
for (final RevCommit commit : revWalk) {
System.out.println("Time: " + commit.getAuthorIdent().getWhen() + " Message: " + commit.getShortMessage());
}
}
}
并且
public static void fileWalk(final Git repo, final String modulePath) throws IOException {
final Ref head = repo.getRepository().findRef("HEAD");
final RevWalk walk = new RevWalk(repo.getRepository());
final RevCommit commit = walk.parseCommit(head.getObjectId());
final RevTree tree = commit.getTree();
System.out.println("Having tree: " + tree);
final TreeWalk treeWalk = new TreeWalk(repo.getRepository());
treeWalk.addTree(tree);
treeWalk.setRecursive(true);
treeWalk.setFilter(PathFilterGroup.createFromStrings(modulePath));
while (treeWalk.next()) {
System.out.println("found: " + treeWalk.getPathString());
}
walk.close();
treeWalk.close();
}
revWalk
检查要处理的新 tmpBranch,然后列出所有提交以及时间和消息。
fileWalk
获取 HEAD 并列出与 modulePath
给定过滤器匹配的所有文件
我想达到git filter-branch -f --subdirectory-filder $2 HEAD
我必须结合两种方式,但说实话我不知道该怎么做。您能否指出正确的方向并给我一些代码示例?
最佳答案
回答我自己的问题:
我使用 ProcessBuilder 来执行给定的脚本,并执行了以下操作。
private void executeScript(final String pathToGitBash, final File scriptFileToExecute, final String... arguments) throws IOException, InterruptedException {
final int offset = 4;
final String[] command = new String[arguments.length + offset];
command[0] = pathToGitBash;
command[1] = "--login";
command[2] = "-i";
command[3] = scriptFileToExecute.getAbsolutePath();
for (int i = 0; i < arguments.length; i++) {
command[i + offset] = arguments[i];
}
final ProcessBuilder builder = new ProcessBuilder(command);
builder.redirectErrorStream(true);
final Process process = builder.start();
IOUtils.copy(process.getInputStream(), System.out);
IOUtils.copy(process.getErrorStream(), System.err);
switch (process.waitFor()) {
case 1:
LOGGER.error("Parameters for scripts are not correct.");
break;
case 0:
LOGGER.info("Script seemed to execute properly");
break;
default:
LOGGER.info("Unknown returnCode. Script finished with: {}", process.exitValue());
}
}
要使用 Gitbash 执行它,我需要提供 gitbash/sh.exe 和参数“--login -i”
关于java - 如何使用 JGit 执行 "git filter-branch --subdirectory <folderName>",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43602710/
如何写入子文件夹中的文件?这里的其他答案说使用路径,但没有运气。在我的代码中,对于whichFileToSaveTo,如果我从中删除“/Subfolder/”,我的代码将正常工作并写入文件。使用“/S
我在 yii2 安装的项目中创建了一个子文件夹,我想将此子文件夹作为普通的 html 网站使用,但它重定向到 yii2 登录页面。如何让它像普通的html网站一样工作? 最佳答案 在我看来,你可以将你
我有一个带有布局的 Python 项目 setup.py foobar/ __init__.py foo.py bar/ __init__.py foobar/
我喜欢使用 IPython(或现在的 Jupyter)notebook 进行我的 Django 项目所需的某些计算。 Shell_plus 为我完成了这项工作。但是随着 IPython noteboo
在子目录或别名中部署 symfony2 应用程序的最佳方法是什么? 假设我的应用程序将在:http://domain/symfonytest 下运行 symfonytest 是我文件系统中某个目录的别
我正在开发一个包含前端和后端的包。我遵循有关为后端和前端部件构建 Controller 和 View 的最佳方法的说明here和 here .但是我找不到如何在我的路由配置文件中指定子目录。我试着把这
我有两个有关 CMake 的问题 假设我们有一个变量${MY_CURRENT_DIR},它包含一个目录的路径,该目录包含多个子目录:mydir1、mydir2 和 mydir3。我想检测这些子目录并将
我想找到给定目录中子目录中最长的路径,因为我遇到了这个错误: The specified path, file name, or both are too long. The fully qualif
我的网站有表单验证,一切正常。现在我想创建一个子目录并为其设置密码保护,但是!我需要该子目录使用与整个网站使用的一组完全不同的登录名/密码。 例如,我将网站的用户存储在数据库的“用户”表中。但是对于子
我有一个包含多个文件的文件夹,我想将它们移动到子文件夹中: mkdir subfolder mv ./* subfolder 但是当我这样做时,我得到: mv: 无法将“子文件夹”移动到其自身的子目录
我在 Mac 上使用 Pycharm。在下面的脚本中,我在名为 dwnld.py 的文件上调用 os.path.isfile 函数。它打印出“文件存在”,因为 dwnld.py 与脚本 (/Users
这是我的目录结构: app/ template/ layout/ base.tmpl index.tmpl template.ParseGlob("*/*.tmpl")
我正在开发一个名为 'vee-type-safe' 的库,用于运行时类型检查。一切都很顺利,直到我添加了一个子目录 /express 和一个文件 /express/index.ts,我在其中导出了一些
这已经困扰我很长时间了。我喜欢使用wildmenu 在命令模式下浏览目录。问题是要进入子目录我需要使用 总是遥不可及的 key 。我试图做一些映射来克服这个问题,但没有成功。例如: cnoremap
如何在 Jenkins Workflow: Multibranch job 中从 SCM 结帐到作业工作区的子目录?是否有任何选择: checkout scm 最佳答案 dir('subdir') {
以下是相关的配置文件,也位于http://dpaste.com/97213/。 apache配置当前正在工作,因为访问“example.com/”会向我显示我放置在文档根目录下的index.html文
我想在我的 blob 中创建一些子目录。但效果并不好 这是我的代码 protected void ButUpload_click(object sender, EventArgs e) {
(我知道这本身不是一个编程问题,但它涉及正则表达式,所以至少它是边界......) 设置: Windows 上带有 mod_rewrite 的 Apache 2.0。两个域,我们称它们为domain1
我有一个文件指向基本目录: File baseDir = new File("c:\\baseDir"); 现在我想“进入子目录”: File subDir = new File("c:\\baseD
我正在为一个硬件编写一个 Linux 设备驱动程序,该硬件提供多个独立的数据“ channel ”。系统中可能存在多个设备,每个设备提供一组 channel ,这些 channel 将被表示为基本独立
我是一名优秀的程序员,十分优秀!