"Путь запуска недоступен" с помощью 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. Пожалуйста, убедитесь, что все процессы завершены, затем повторите попытку. Если это все еще не удается, возможно, произошел сбой в этом хранилище в этом хранилище: удалите файл вручную, чтобы продолжить.