说我正在做这样的事情:
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.