Esta é geralmente a melhor maneira:
( cd dir ; git init )
ou
( cd dir && git init )
É bem curto e fácil de digitar. Ele inicia um sub-shell, então você não pode modificar seu ambiente, mas isso não parece ser um problema aqui.
Diga que estou fazendo isso:
cd subdir
git init
cd ../
Existe uma maneira de fazer isso com um único comando, ou talvez dois, em vez de ter que entrar e sair de um diretório para executar um comando lá?
(Não está procurando por uma solução específica do git; isso é apenas um exemplo.)
Eu estava procurando uma maneira de executar o comando git de um caminho e fazer alterações no repositório em um caminho diferente. Então acabei nessa questão aqui.
Mas, para as minhas necessidades específicas, nem a resposta aceita nem nenhuma das outras ajudaram.
Eu precisava executar comandos do git usando sudo -u USER /usr/bin/git
(outro usuário executando-o). E como você deve saber, o sudo não me permite executar o comando cd
, então não posso estar no diretório do repositório.
Então, eu fui para a página man do git . E entre as opções, vi o --git-dir=<path>
:
--git-dir=
Set the path to the repository. This can also be controlled by setting the GIT_DIR environment variable. It can be an absolute path or relative path to current working directory.
Então, se ajudar alguém, você ainda pode usar o git em um caminho e fazer alterações em um repositório "longe de você". Apenas use:
git --git-dir=/path/to/repository GIT_COMMAND
ou, para executá-lo como outro usuário, faça algo como:
echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir=/path/to/repository GIT_COMMAND
Também em página de manual do git-init :
If the $GIT_DIR environment variable is set then it specifies a path to use instead of ./.git for the base of the repository.
Portanto, se você deseja iniciar o repositório na pasta usual .git, será necessário especificá-lo junto com a opção --git-dir
. por exemplo:
echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir=/path/to/repository/.git init
Após inicializar o repositório em /path/to/repo/.git
, todos os outros comandos devem ter a opção --work-tree=<path>
, conforme descrito na página man do git:
--work-tree=
Set the path to the working tree. It can be an absolute path or a path relative to the current working directory. This can also be controlled by setting the GIT_WORK_TREE environment variable and the core.worktree configuration variable (see core.worktree in git-config(1) for a more detailed discussion).
Assim, o comando certo para executar o git como outro usuário e inicializar um novo repositório é:
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
Não exatamente o que você está perguntando (você tem respostas reais acima com o subshell), mas veja pushd
e popd
Você tem algumas opções. Você pode agrupar os comandos com &&
ou ;
. Assim:
cd subdir && git init && cd ..
ou
cd subdir; git init; cd ..
A diferença entre eles é que, no primeiro exemplo, se um dos comandos falhar, ele não executará o resto deles. No segundo exemplo, todos os comandos serão executados de qualquer maneira.
Outra opção seria definir uma função e usá-la, por exemplo:
function cdinit() {
cd $1
git init
cd ..
}
Então você pode executar o comando:
cdinit subdir
E será automaticamente git init
nesse diretório e sairá dele.
Você também pode fazer uma solução mais complexa usando uma função se tiver vários diretórios e quiser git init
-los com um comando.
function cdinit() {
for arg in $@
do
cd $arg
git init
cd ..
done
}
Você pode executar isso com:
cdinit subdir1 subdir2 subdir3
E fará git init
em subdir1
, subdir2
e subdir3
.
No caso de git
(pelo menos na versão 2.7.0), você pode aproveitar a opção -C
que faz o git se comportar como se tivesse sido iniciado no diretório fornecido. Então sua solução pode parecer:
> git -C subdir init
Initialized empty Git repository in /some/path/subdir/.git/
Citando a documentação:
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.
Você pode agrupar os comandos com & & amp ;, ou seja,
cd subdir && git init && cd ../
Se você não quer nenhuma dependência no código de saída de cada comando, você pode usar; em vez disso, ou seja:
cd subdir ; git init ; cd ../
Você precisa entrar no diretório de destino se o comando não tiver um nome de arquivo ou um parâmetro de nome de diretório.
Mas você pode escrever um script bash que use o diretório de destino e o comando como parâmetros. Para isso, você pode dar uma olhada no pushd e popd: link
Eu escreveria esse pequeno script para você, mas não tenho uma caixa do Linux aqui:)
Os programas têm formas diferentes de lidar com argumentos, então alguns terão alguma equivalente da opção -pasta = nome . Além dessa exceção, o padrão, mesmo no MS DOS, é simplesmente
$ programa subdir
Às vezes você precisa
$ programa subdir /
O programa abrirá a pasta, trabalhará com ela da mesma maneira que você trabalha com um arquivo e, uma vez terminado, retornará o controle para o seu shell, que é apontado para o seu diretório padrão original. Os programas manipulados desta forma têm o problema de que as saídas de erro (como core dumps) vão para um arquivo no diretório atual do seu shell (em vez de subdir .)
Não há solução alternativa, a menos que o programa tenha opções de comando disponíveis para especificar um local diferente. Alguns programadores tiram licença artística entre "o programa de diretório foi chamado de " e "o programa de diretório foi informado para trabalhar em ."
Tags bash