我正在尝试使用此命令:
git checkout `git rev-list -n 1 --before="2009-07-27 13:37" master`
我正在运行ProcessBuilder。现在,我知道我的其余代码都可以正常工作,因为我已经用其他示例对其进行了测试。但是我不确定如何拆分此命令,以便它可用于ProcessBuilder。
显然,此方法不起作用:
String[] command = {"git", "checkout", "`git rev-list -n 1 --before=\"2014-01-01 12:00\" master`"};
这不能正常工作:
String[] command = {"git", "checkout", "`git", "rev-list", "-n", "1", "--before=\"2014-01-01 12:00\"", "master`"};
我也没有从控制台获得任何输出(我执行InputStream),这意味着我很难弄清问题所在。我认为对于熟悉ProcessBuilders的人来说,这个问题应该很明显,所以是的。
我其余的代码如下:
ProcessBuilder processBuilder = new ProcessBuilder(command);
processBuilder.directory(new File(fullPath));
process = processBuilder.start();
当我检查它时,该目录的路径应该是正确的(它在存储库的主目录中)。
如果有可能需要提供代码的其他部分,我会提供。
答案 0 :(得分:2)
反引号实际上是由unix shell处理的-Java不会处理它们。使用流程生成器时,应执行反引号中给出的命令,并将输出作为参数传递给第二个命令。下面是一个简单的示例:(使用'ls')。
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.io.IOUtils;
public class ProcessBuilderTest {
public static void main(String[] args) throws IOException, InterruptedException {
// Command: ls `ls /etc/passwd /etc/services`
// Read the output from the command second ls...
ProcessBuilder pb = new ProcessBuilder("ls", "/etc/passwd", "/etc/services");
Process process = pb.start();
InputStream is = process.getInputStream();
List<String> lines = IOUtils.readLines(is, Charset.defaultCharset());
ArrayList<String> cmdParts = new ArrayList<>();
cmdParts.add("ls");
cmdParts.addAll(lines);
// Construct the second command
ProcessBuilder pbLs = new ProcessBuilder(cmdParts);
Process lsProcess = pbLs.start();
System.out.println(IOUtils.readLines(lsProcess.getInputStream(), Charset.defaultCharset()));
lsProcess.waitFor();
}
}