Execute um comando de outro diretório no bash

96

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.)

    
por Trevor Burnham 17.04.2011 / 18:05

8 respostas

169

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.

    
por 17.04.2011 / 18:27
21

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
    
por 21.06.2012 / 01:56
12

Não exatamente o que você está perguntando (você tem respostas reais acima com o subshell), mas veja pushd e popd

    
por 17.04.2011 / 19:39
5

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 .

    
por 17.04.2011 / 18:17
5

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. 
    
por 19.02.2016 / 16:14
2

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 ../
    
por 17.04.2011 / 18:09
2

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:)

    
por 17.04.2011 / 18:18
1

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 ."

    
por 17.04.2011 / 18:40

Tags