回答:
多くの場合、これが最良の方法です。
( cd dir ; git init )
または
( cd dir && git init )
それは非常に短く、入力が簡単です。サブシェルが起動するため、そこから環境を変更することはできませんが、ここでは問題にならないようです。
$?
サブシェルで実行された最後のコマンドの終了コードが含まれます。&&
バリアントを使用する場合(通常はそうする必要があります)、失敗した最初のコマンドの終了コードを取得します(すべてが正常に実行された場合は0になります)。
パスからgitコマンドを実行し、別のパスでリポジトリを変更する方法を探していました。だから私はここでこの質問に終わった。
しかし、私の特定のニーズのために、受け入れられた答えも他のものも役に立たなかった。
sudo -u USER /usr/bin/git
(実行中の別のユーザー)を使用してgitコマンドを実行する必要がありました。あなたが知っているかもしれないように、sudoは私が実行することはできませんcd
コマンドを、私はできませんことリポジトリのディレクトリに。
それで、gitのmanページに行きました。そして、オプションの中で、私は見ました--git-dir=<path>
:
--git-dir =
リポジトリへのパスを設定します。これは、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のmanページ:
$ 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のマニュアルページで説明されているように、オプションが必要です。
--work-tree =
作業ツリーへのパスを設定します。絶対パスまたは現在の作業ディレクトリからの相対パスを指定できます。これは、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 user@domain.com: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
sudo -i
かsudo su
、インタラクティブなルートシェルを取得することができます。
( cd subdir && sudo -u USER /usr/bin/git init )
。
subdir
か?
いくつかのオプションがあります。&&
またはでコマンドをグループ化できます;
。このような:
cd subdir && git init && cd ..
または
cd subdir; git init; cd ..
これらの違いは、最初の例では、コマンドの1つが失敗した場合、残りのコマンドは実行されないことです。2番目の例では、すべてのコマンドが何であれ実行されます。
別のオプションは、関数を定義してそれを使用することです。例えば:
function cdinit() {
cd $1
git init
cd ..
}
その後、次のコマンドを実行できます。
cdinit subdir
そして、自動的git init
にそのディレクトリに移動し、そこから移動します。
多数のディレクトリがありgit init
、1つのコマンドでそれらを使用する場合は、関数を使用してより複雑なソリューションを実行することもできます。
function cdinit() {
for arg in $@
do
cd $arg
git init
cd ..
done
}
次に、これを次のコマンドで実行できます。
cdinit subdir1 subdir2 subdir3
そして、それは何だろうgit init
ではsubdir1
、subdir2
とsubdir3
。
&&
、;
もっとエレガントなものを望んでいました。スクリプトを書くことは私の最善の選択肢のようです。
cdinit
関数を任意のコマンドに一般化できると思いますか?引数だけを使ってみましたが、うまくいきませんでした。
;
であるため、3行関数はと同等cd $1; git init; cd ..
です。(2)あなたは、変数を引用する必要があります"$1"
、"$@"
と"$arg"
。それとも、短縮することができますfor arg in "$@"
にfor arg
。
以下の場合には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.
コマンドを&&でグループ化できます。つまり、
cd subdir && git init && cd ../
各コマンドの終了コードに依存しない場合は、;を使用できます。代わりに、すなわち:
cd subdir ; git init ; cd ../
;
、前の戻りコードに依存しないようにします。
cd subdir && git init ; cd ..
実際には最も意味があります。ユーザーがでgit init
コマンドを実行したい場合、subdir
おそらく現在のディレクトリでコマンドを実行したくないでしょう。つまり、(最初の)cd
が失敗した場合に実行したくないということです。(既ににいるcd
ので失敗する可能性はあり ますが、それはコーナーケースです。)…(続き)subdir
cd
場合は、git init
コマンドが失敗しても開始ディレクトリにバックアップすることをお勧めし ます。(または、サブディレクトリにとどまってコマンドの失敗を診断することもできます。)(2)/
after を含める必要はありません..
。
プログラムには引数を処理するさまざまな方法があるため、-folder = nameオプションに相当するものがいくつかあります。その例外を越えて、標準は、MS DOSでさえ、単に
$ プログラムのサブディレクトリ
時々あなたが必要です
$ program subdir /
プログラムはフォルダを開き、ファイルを操作するのと同じように操作し、終了したら、元の標準ディレクトリを指すシェルに制御を戻します。この方法で処理されるプログラムには、エラー出力(コアダンプなど)がシェルの現在のディレクトリ(subdirではなく)のファイルに送られるという問題があります。
プログラムに別の場所を指定するためのコマンドスイッチがない限り、回避策はありません。一部のプログラマーは、「ディレクトリプログラムの呼び出し元」と「ディレクトリプログラムがで動作するように指示された」との間で芸術的なライセンスを取得しています。