"Путь запуска недоступен" с помощью NSTask для создания коммита Git

Я пытаюсь использовать 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 используя NSOpenPanel (стандартный диалог открытия OS X).

В терминале XCode я получаю сообщение "путь запуска не доступен"

Так что я делаю не так?

Обновление После комментария от Джоша Касвелла это мой код

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 ответа

Решение

Задачи launchPath путь к программе, которую вы хотите запустить: здесь Git, так что этот путь, вероятно, должен быть /usr/local/bin/git, И удалить @"git" из аргументов; это не аргумент, это исполняемый файл.

Путь к вашему проекту должен быть использован для задачи currentDirectoryPath чтобы у него был правильный рабочий каталог.

С указателями из ответа Джоша Кассвелла мне удалось выяснить это. Я обнаружил, что мне нужно удалить часть "file://" из projectPath. Поэтому путь к проекту должен быть @"/Users/MYNAME/Desktop/MYPROJECT/". Также он не должен содержать пробелов, потому что он не работает с escape-символом%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]; если вы продолжаете получать сообщение

Неустранимый: невозможно создать '/Users/MYNAME/Desktop/MYPROJECT/.git/index.lock': файл существует.

Похоже, в этом репозитории запущен другой процесс git, например, редактор, открытый git commit. Пожалуйста, убедитесь, что все процессы завершены, затем повторите попытку. Если это все еще не удается, возможно, произошел сбой в этом хранилище в этом хранилище: удалите файл вручную, чтобы продолжить.

Другие вопросы по тегам