在 bash 中从另一个目录执行命令

在 bash 中从另一个目录执行命令

说我正在做这样的事情:

cd subdir
git init
cd ../

有没有办法用一个命令或两个命令来做到这一点,而不必进出目录才能在那里运行命令?

(不寻找特定于 git 的解决方案;这只是一个例子。)

答案1

这往往是最好的方法:

( cd dir ; git init )

或者

( cd dir && git init )

它很短而且容易输入。它确实会启动一个子 shell,因此您无法从中修改环境,但这似乎不是问题。

答案2

我正在寻找一种方法来从某个路径执行 git 命令,并在不同的路径中对存储库进行更改。所以我最终在这里遇到了这个问题。

但对于我的特定需求,无论是接受的答案还是其他答案都没有帮助。

我需要使用sudo -u USER /usr/bin/git(另一个用户正在运行)来运行 git 命令。您可能知道,sudo 不允许我运行该cd命令,所以我不能在存储库目录中。

所以,我去了git 的手册页。在这些选项中,我看到了--git-dir=<path>

--git 目录=

设置存储库的路径。这也可以通过设置 GIT_DIR 环境变量来控制。它可以是绝对路径,也可以是当前工作目录的相对路径。

因此,如果它对某人有帮助,您仍然可以从路径中使用 git 并对“远离您”的存储库进行更改。只需使用:

git --git-dir=/path/to/repository GIT_COMMAND

或者,以另一个用户身份运行它,执行以下操作:

echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir=/path/to/repository GIT_COMMAND

更多来自git-init 的手册页

如果设置了 $GIT_DIR 环境变量,那么它会指定一个路径来代替 ./.git 作为存储库的基础。

因此,如果您想在通常的 .git 文件夹下初始化存储库,则需要与选项一起指定它--git-dir。例如:

echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir=/path/to/repository/.git init

在 上初始化存储库后/path/to/repo/.git,所有后续命令都应具有选项--work-tree=<path>,如 git 的手册页中所述:

--工作树=

设置工作树的路径。它可以是绝对路径,也可以是相对于当前工作目录的路径。这也可以通过设置 GIT_WORK_TREE 环境变量和 core.worktree 配置变量来控制(有关更详细的讨论,请参阅 git-config(1) 中的 core.worktree)。

因此,以另一个用户身份运行 git 并初始化新存储库的正确命令是:

echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir=/path/to/repository/.git init
echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir='/path/to/repository/.git' --work-tree='/path/to/repository' add /path/to/repository/*
echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir='/path/to/repository/.git' --work-tree='/path/to/repository' commit -m 'MESSAGE'
echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir='/path/to/repository/.git' --work-tree='/path/to/repository' remote add origin [email protected]:path
echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir='/path/to/repository/.git' --work-tree='/path/to/repository' push -u origin master

答案3

不完全是你要问的(你在上面用子shell有真正的答案),但pushd看看popd

答案4

在这种情况下git(至少在 2.7.0 版本中),您可以利用该-C选项使 git 表现得好像它是在给定目录中启动的。因此您的解决方案可能如下所示:

> git -C subdir init
Initialized empty Git repository in /some/path/subdir/.git/

引用文档:

Run as if git was started in <path> instead of the current working directory. When multiple -C options are given, each subsequent non-absolute -C
<path> is interpreted relative to the preceding -C <path>.

This option affects options that expect path name like --git-dir and --work-tree in that their interpretations of the path names would be made
relative to the working directory caused by the -C option. 

相关内容