gpt4 book ai didi

c++ - 如何在不调用 "-m"选项的情况下自动执行 git commit,以处理内部引号?

转载 作者:行者123 更新时间:2023-11-30 02:26:11 26 4
gpt4 key购买 nike

这是我的问题。我有一个 C++ 脚本,它将字符串作为将用于提交消息的消息。

这几乎适用于所有情况,但是问题出现在 <msg> 时包含转义的单引号或双引号,因此命令如下所示:

git commit -m 'A new message \' with many escaped \" \' quotes \"'

因此 git 会感到困惑。

我不想考虑如何在提交消息中转义这些引号,所以我认为最好的方法是避免使用 -m标志,就是做一个普通的 git commit并通过 <msg>以某种方式 vi 或 ed,然后退出并保存

我尝试使用 ed:

git commit | ed << <msg>

vi:

git commit | vi << I << <msg> << :wq

如您所见,我对 Linux 真的很陌生,而且我还没有在网上找到任何内容来描述我正在尝试做的事情。 所以问题又是:在不调用 -m 的情况下将特定消息提交给 git 的 shell 命令的正确顺序是什么?旗帜。我在这里做错了什么?

最佳答案

如果您只是在运行 Git,则根本不要生成 shell;直接生成 git 并传递 ["git", "commit", "-m", message] 作为它的 argv。在 C++ 中:

#include <string>

extern "C" {
#include <sys/wait.h>
#include <unistd.h>
}

struct child_process {
FILE* file;
pid_t pid;

child_process(FILE* file_, pid_t pid_) :
file(file_),
pid(pid_) {}
};

template<std::size_t n> static child_process popenv(std::string const& path, std::string const (&args)[n]) {
char const* const c_path = path.c_str();
char const* c_argv[n + 2];

c_argv[0] = c_path;
c_argv[n + 1] = NULL;

std::size_t i = 1;

for (std::string const& arg : args) {
c_argv[i++] = arg.c_str();
}

int fds[2];
pipe(fds);
pid_t const pid = fork();

if (pid == -1) {
throw std::system_error(errno, std::system_category());
}

if (pid == 0) {
dup2(fds[1], 1);
execvp(c_path, const_cast<char* const*>(c_argv));
_exit(EXIT_FAILURE);
}

return child_process(fdopen(fds[0], "r"), pid);
}

static int pclosev(child_process const& process) {
int status;

fclose(process.file);

if (waitpid(process.pid, &status, 0) == -1) {
throw std::system_error(errno, std::system_category());
}

return status;
}
std::string const message = "A new message ' with many escaped \" ' quotes \"";
child_process p = popenv("git", {"commit", "-m", message});

// read from p.file; use pclosev() instead of pclose()

如果出于某种原因确实需要 shell,请在其 argv 中传递消息并运行 git commit -m "$1"

如果出于某种原因你真的需要让 git commit 从标准输入读取它的消息,运行 git commit -F -。 (- 可以替换为任何文件以读取该文件。)

关于c++ - 如何在不调用 "-m"选项的情况下自动执行 git commit,以处理内部引号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43167703/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com