我正在尝试设置一个宏来设置 git repo 进行版本控制,这样我就不必每次都求助于手动终端命令。提交并推送脚本已经准备就绪并开始工作,但它正在初始化一个新的 git repo,这让我很伤心:
这个想法是,脚本将执行 4 个功能:
- 在文件保存的同一目录中初始化 git repo
- 克隆一个远程仓库(我有一个基础仓库,里面有我想放到我创建的所有 tex 项目中的脚本/包)
- 创建新的远程仓库(使用节点 GH)并将其指定为原点(基本上重新创建通过命令行从自己那里分叉 repo 的能力)
- 提交并将所有文件推送到新的远程存储库。
这是我的代码:
%SCRIPT
buildManager.runCommand("git init", editor.fileName());
buildManager.runCommand("gh re --new " + editor.fileName() +
" --type private", editor.fileName());
buildManager.runCommand("git clone https://github.com/example/example.git "
+ editor.fileName(), editor.fileName());
buildManager.runCommand("git remote set-url origin https://github.com/example/"
+ editor.fileName(), editor.fileName());
buildManager.runCommand("git push origin master", editor.fileName());
buildManager.runCommand("git push --all", editor.fileName())
问题是我认为 TeXStudio 没有按出现的顺序执行命令,这导致某些命令失败(底部的示例输出)。有没有办法定义命令执行的顺序?或者,我可以通过调用 bash 脚本(我可以在其中定义顺序)并通过宏传递工作目录来执行相同操作吗?
日志输出:
Process started: git push --all
fatal: Not a git repository (or any of the parent directories): .git
Process exited with error(s)
fatal: Not a git repository (or any of the parent directories): .git
Process exited with error(s)
fatal: Not a git repository (or any of the parent directories): .git
Process exited with error(s)
fatal: could not create work tree dir '/NewProject': Permission denied
/.git: Permission denied
Process exited with error(s)
Process exited with error(s)
Process exited normally
答案1
buildmanager.runCommand()
不等待命令终止。如果您需要该控制,则应改用system()
。它会返回一个进程对象,然后您可以控制该对象(有关详细信息,请参阅手册)。
在您的特定情况下,这仍然有点繁琐,因为您希望在文件目录中执行命令。截至目前(TXS 2.10.8),的工作目录system()
是 TeXstudio 的工作目录。因此,您要么必须从所需目录中的 shell 启动 TeXstudio,要么必须将 git 调用包装在首先更改目录的 shell 脚本中。
未来的版本将允许使用可选的第二个参数来system()
提供工作目录。
filename = editor.fileName()
workdir = filename.substring(0, filename.lastIndexOf("/"))
proc = system("git init", workdir)
proc.waitForFinished()
...
答案2
这是一个解决方法,直到 TeXStudio 允许在其system()
命令中使用参数(请参阅Tim Hoffmann 的回答了解详情)。
接下来的工作基本上是这样的:一个 shell 脚本将工作目录更改为所需路径,使用 Node GH 创建具有所需名称的远程存储库并将其克隆到工作目录。工作目录和存储库名称通过两个输入对话框作为参数传递给脚本。
%SCRIPT
choisedialog = UniversalInputDialog()
choisedialog.setWindowTitle("Repo Name")
choisedialog.add(editor.fileName(), "New Repository:", "name")
if (choisedialog.exec() != null) {
dialog = new UniversalInputDialog()
dialog.setWindowTitle("Working Dir")
dialog.add(editor.fileName(), "Dir path:", "dir")
if (dialog.exec() != null) {
repoName = choisedialog.get("name")
workDir = dialog.get("dir")
system("sh /Users/nikko/git/scripts/createRepo.sh " + repoName + " \"" + workDir + "\"")
}
}
创建Repo.sh:
#!/bin/bash
#make sure you clone the generic repo on an empty folder,
#otherwise git will complain.
file="$1"
dir="$2"
cd "$dir"
gh re --new "$file" --type private \
&& git clone https://github.com/user/genericRepoName.git . \
&& git remote set-url origin https://github.com/user/"$file".git \
&& git push origin master \
&& git push --all