66

すべての構成ファイルが置かれているディレクトリを指すシェル変数があります。変数がで作成されていると仮定しましょうexport RC=$HOME/rc。構成ディレクトリにグローバル無視ファイルがあります:~/rc/globalgitignore

私の質問は、ファイル内のRC変数をどのように展開できますか?.gitconfig

私はすでに次のことを試しました:

  • excludesfile = $RC/globalgitignore

  • excludesfile = !$RC/globalgitignore

  • excludesfile = !echo $RC/globalgitignore

  • excludesfile = !$(echo $RC/globalgitignore)

これらのソリューションはどれも機能しません。

フルパスを入力した場合にこれが機能する唯一の方法: 。ただし、ディレクトリを別の場所にexcludesfile = ~/rc/globalgitignore移動する場合は、パスを変更する必要があります。rc

4

3 に答える 3

53

できません。git-config(1)は環境変数の拡張をサポートしていませんが、限定された型変換とパス拡張のみをサポートしています。

型指定子は--intまたは--boolのいずれかで、git configで変数が指定された型であることを確認し、値を正規の形式(intの単純な10進数、「true」またはboolの「false」文字列)、またはパス拡張を行う--path(以下の--pathを参照)。タイプ指定子が渡されない場合、値に対してチェックまたは変換は実行されません。

--path州のドキュメント:

- 道

git-configは展開され、〜は$ HOMEの値になり、〜userは指定されたユーザーのホームディレクトリになります。このオプションは、値を設定するときに効果がありません(ただし、コマンドラインからgit config bla〜/を使用して、シェルに拡張を実行させることができます)。

「拡張」という用語は、の別のコンテキストでは表示されませんgit-config(1)。では、そのような機能がどこにも文書化されていないことを考えると、どうやってそれが必要だという考えを思いついたのでしょうか。

環境変数を展開するには、Git構成ファイルを自分で前処理する必要があります。つまり、テンプレートファイルを作成し、ファイルを$HOMEディレクトリにコピーする前に、スクリプトを使用して変数を展開します。

ドットファイル管理に関する場合は、すべての人が行うことを実行します。ディレクトリにそれらを配置し、からこのディレクトリにシンボリックリンクを追加します$HOME

于 2012-06-29T12:52:50.160 に答える
30

構成でbashスクリプトを使用して、変数の拡張を有効にします。.bashrcで必要な変数をエクスポートし、スクリプトで使用するだけです。

私の〜/ .bashrcで:

export TESTVARIABLE="hello"

私の〜/ .gitconfigで:

[alias]
    test = !bash -c '"echo \"Value: $TESTVARIABLE\";"'

私のbashプロンプトで:

bash> git test
    Value: hello 

もう1つの方法は、シェルのrcにgitconfigコマンドを追加することです。たとえば、.bashrcには次のようなものがあります。

git config --global user.name "$USER@$HOSTNAME"

すべてのマシンで同じ構成を使用しており、これを追加することで、異なるマシンからのコミットを区別できます。同じことをして、シェルrcに追加することもできます。

export RC="$HOME/rc"
git config --global core.excludesfile "$RC/globalgitignore" 
于 2014-02-05T10:23:20.177 に答える
9

Git 2.31(Q1 2021)では、環境変数を介して構成変数と値のペアを使用することを検討できます(また、変数とGIT_CONFIG_PARAMETERS値のペアをエンコードする方法を微調整して、より堅牢にします)。

Patrick Steinhardt()によるcommit d8d7715 、commit b9d147fcommit 1ff21c0commit b342ae6commit ce81b1d(12 Jan 2021)、およびcommit b0812b6(07 Jan 2021)を参照してください。ジェフ・キング()によるcommit f9dbb64commit 13c4495(2021年1月12日)を 参照してください。( Junio C Hamanoによってマージされました---コミット294e949、2021年1月25日pks-t
peff
gitster

config:設定を渡すための新しい方法を追加--config-env

共著-作成者:Jeff King
署名者:Patrick Steinhardt

manを介してランタイム構成を渡すことはすでに可能ですが、値に機密情報が含まれている場合に使用することは望ましくない場合があります。 たとえば、認証トークンを含める ように設定する場合、を介して行うと、通常はコマンド引数も表示されるなどを介してそれらの資格情報が簡単にリークされます。git -c <key>=<value>

http.extraHeader-cps(1)

クレデンシャルをリークせずにこのユースケースを有効にするために、このコミットにより新しいスイッチが導入され--config-env=<key>=<envvar>ます。

指定されたキーの値を直接渡す代わりに、ユーザーが環境変数の名前を指定できるようにします。
その変数の値は、キーの値として使用されます。

git現在、そのマニュアルページに含まれています:

[--super-prefix=<path>] [--config-env <name>=<envvar>]

git現在、そのマニュアルページに含まれています:

--config-env=<name>=<envvar>

のよう-c <name>=<value>に、構成変数' <name>'に値を指定します。ここで、<envvar>は値を取得する環境変数の名前です。

-c値を空の文字列に直接設定するショートカットがないのとは異なり 、代わりに環境変数自体を空の文字列に設定する必要があります。

<envvar>環境にが存在しない場合はエラーになります。<envvar>等号を含むsとのあいまいさを避けるために、等号を含めることはできません<name>

/proc/self/cmdlineこれは、一時的な構成オプションをgitに渡したいが、他のプロセスがコマンドライン(eg )を読み取れるが環境(eg )は読み取れないOSでそうしている場合に便利です/proc/self/environ
この動作はLinuxのデフォルトですが、システムにはない場合があります。

これにより http.extraHeader、機密情報が値の一部である場合などの変数のセキュリティが追加される可能性がありますurl.<base>.insteadOfが、機密情報がキーの一部である可能性がある場合などは追加されないことに注意してください。

あなたの場合、それをテストしてください:

git --config-env=core.excludesfile=RC config core.excludesfile
# or (Git 2.32+ only)
git --config-env core.excludesfile=RC config core.excludesfile

の値は次のcore.excludesfileようになります$RC(ただし、親フォルダーだけでなく、完全なファイルパスを参照する必要があります)


注:Git 2.32(2021年第2四半期)以前は、 " git --config-env var=val cmd" manは受け入れられませんでした(受け入れられただけ--config-env=var=valです)。

Patrick Steinhardt()によるcommit c331551commit 9152904(2021年4月29日)を参照してください。( Junio C Hamanoによってマージされました---コミット5f586f5、2021年5月7日pks-t
gitster

git--config-env:の値に個別の引数をサポート

サインオフ-作成者:Patrick Steinhardt
レビュー者:Jeff King

そのように文書化されていませんが、トップレベルのオプションの多くは2つの構文を好み--git-dir--work-treeサポートしています。オプションとその値の間の等号を受け入れ、オプションと値を2つの別個の引数としてサポートします。
最近追加された--config-envオプションは、等号の構文のみをサポートします。

両方の構文を受け入れ、テストを追加して両方の動作を検証することにより、この不整合を緩和します。


しかし、Git 2.31にはまだまだあります:

config:envvarペアを介して構成エントリを指定できるようにする

サインオフ-作成者:Patrick Steinhardt

現在、GIT_CONFIG_PARAMETERSランタイム構成データをgitプロセスに渡すために使用できる環境変数がありますが、これは内部実装の詳細であり、エンドユーザーが使用することは想定されていません。

内部使用のみであることに加えて、構成エントリを渡すこの方法には大きな欠点があります。構成キーは単一の変数にキーと値の両方を含むため、解析する必要があります。
そのため、値に含まれる潜在的に有害な文字をエスケープするのはユーザーに任されています。これは、値がサードパーティによって制御されている場合は非常に困難です。

したがって、このコミットは、この欠点を取り除く環境を介して構成エントリを追加する新しい方法を追加します。
ユーザーがGIT_CONFIG_COUNT=$n環境変数を渡すと、Gitは環境変数のペアをGIT_CONFIG_KEY_$i解析しGIT_CONFIG_VALUE_$iます。i[0,n)

manでも同じことができますが、機密情報の可能性がある場合はそうしないことをお勧めします。 たとえば、認証トークンを含める ように設定する場合、を介して行うと、通常はコマンド引数も表示されるなどを介してそれらの資格情報が簡単にリークされます。git -c <name>=<value>

http.extraHeader-cps(1)

git config現在、そのマニュアルページに含まれています:

GIT_CONFIG_COUNT

GIT_CONFIG_KEY_<n>

GIT_CONFIG_VALUE_<n>

GIT_CONFIG_COUNTが正の数に設定されている場合、その数までのすべての環境ペア GIT_CONFIG_KEY_<n>がプロセスGIT_CONFIG_VALUE_<n>のランタイム構成に追加されます。

構成ペアはゼロインデックスです。
キーまたは値が欠落している場合は、エラーとして扱われます。空GIT_CONFIG_COUNTはと同じようGIT_CONFIG_COUNT=0に扱われます。つまり、ペアは処理されません。
これらの環境変数は、構成ファイルの値をオーバーライドしますが、を介して渡された明示的なオプションによってオーバーライドされますgit -c

これは、共通の構成で複数のgitコマンドを生成したいが、スクリプトを作成する場合など、構成ファイルに依存できない場合に役立ちます。

例えば:

    GIT_CONFIG_COUNT=2 \
        GIT_CONFIG_KEY_0="pair.one" GIT_CONFIG_VALUE_0="foo" \
        GIT_CONFIG_KEY_1="pair.two" GIT_CONFIG_VALUE_1="bar" \
        git config --get-regexp "pair.*" 

印刷されます:

pair.one foo
pair.two bar
于 2021-01-30T01:05:34.003 に答える