使用NSTask创建Git提交“无法访问启动路径”

时间:2017-04-23 22:34:39

标签: objective-c cocoa nstask

我正在尝试使用NSTask创建Git提交并向该提交添加消息。

这是我尝试的代码。

NSString *projectPath = @"file:///Users/MYNAME/Desktop/MYPROJECT/";
//stage files
NSPipe *pipe = [NSPipe pipe];
NSTask *task = [[NSTask alloc] init];
task.launchPath = projectPath;
task.arguments = @[@"git", @"add", @"."];
task.standardOutput = pipe;
[task launch];

//commit
NSPipe *pipe2 = [NSPipe pipe];
NSTask *task2 = [[NSTask alloc] init];
task2.launchPath = projectPath;
task2.arguments = @[@"git", @"commit", @"-m",@"\"Some Message\""];
task2.standardOutput = pipe2;
[task2 launch];

我使用projectPath(标准OS X打开对话框)收到NSOpenPanel

在Xcode终端,我收到消息 “发射路径无法访问”

那么我做错了什么?

更新 在Josh Caswell的评论之后,这是我的代码

NSString *projectPath = @"file:///Users/MYNAME/Desktop/MYPROJECT/";
NSString *gitPath = @"/usr/local/bin/git"; //location of the GIT on my mac

//stage
NSPipe *pipe = [NSPipe pipe];
NSTask *task = [[NSTask alloc] init];
task.launchPath = gitPath;
task.currentDirectoryPath = projectPath;
task.arguments = @[@"add", @"."];
task.standardOutput = pipe;
[task launch];

[任务启动]之后;我在终端“工作目录不存在”中收到错误消息。

2 个答案:

答案 0 :(得分:1)

任务的launchPath是你要运行的程序的路径:这是Git,所以路径可能需要/usr/local/bin/git。并从参数中删除@"git";它不是一个参数,它是可执行文件。

项目的路径应该用于任务的currentDirectoryPath,以便它具有正确的工作目录。

答案 1 :(得分:1)

根据Josh Casswell的回答,我设法弄明白了。我发现我必须删除"文件://"部分来自projectPath。所以项目路径应该是@" / Users / MYNAME / Desktop / MYPROJECT /"。此外,它不应包含空格,因为它不适用于%20转义字符。这有点奇怪,因为当你使用NSOpenPanel时你得到了NSURL,当你在它上面调用绝对路径时,你会得到" file://"在开始时"%20"而不是路径内的空格。

TLDR; 此代码适用于Xcode 8:

NSString *projectPath = @"/Users/MYNAME/Desktop/MYPROJECT/"; //be careful that it does not contain %20
NSString *gitPath = @"/usr/local/bin/git";
NSString *message = @"this is commit message";

//stage
NSPipe *pipe = [NSPipe pipe];
NSTask *task = [[NSTask alloc] init];
task.launchPath = gitPath;
task.currentDirectoryPath = projectPath;
task.arguments = @[@"add", @"."];
task.standardOutput = pipe;
[task launch];
[task waitUntilExit];

//commit
NSPipe *pipe2 = [NSPipe pipe];
NSTask *task2 = [[NSTask alloc] init];
task2.launchPath = gitPath;
task2.currentDirectoryPath = projectPath;
task2.arguments = @[@"commit", @"-m", message];
task2.standardOutput = pipe2;
[task2 launch];
[task2 waitUntilExit];

<强>更新 添加[task waitUntilExit]; 如果你不断收到消息

  

致命:无法创造   &#39; /Users/MYNAME/Desktop/MYPROJECT/.git/index.lock' ;:文件存在。

     

另一个git进程似乎正在此存储库中运行,例如一个   由#git commit&#39;打开的编辑。请确保所有流程都是   终止然后再试一次。如果它仍然失败,git进程可能会有   之前在此存储库中崩溃:手动删除文件   继续。