14

サーバーには、開発プロセスの原点であり、QA環境への展開を簡素化するためのベアリポジトリがあります。

だからpost-receiveそれは単にします

GIT_WORK_TREE=/home/dev git checkout -f

しかし、製品がより複雑になるにつれて、他のいくつかのことが起こるはずです。deploy.shそのため、リポジトリによって追跡されるスクリプトによって処理されるようになりました。ですから、私がやりたいのは、リポジトリ全体をチェックアウトする代わりに、チェックアウトのみdeploy.shして実行できるようにすることです。私はそのようなものがうまくいくと思いました:

SOURCE_PATH="/home/dev"
GIT_WORK_TREE=$SOURCE_PATH git checkout deploy.sh
$SOURCE_PATH"/deploy.sh"

しかし、エラーが発生しても機能しません。

error: pathspec 'deploy.sh' did not match any file(s) known to git.

私は何が間違っているのですか?それとも、このようにすることは不可能ですか?

4

3 に答える 3

16

「 gitから1つのファイルのみをチェックアウトする」で説明したように、最初にクローンを作成またはフェッチしない限り、1つのファイルだけをチェックアウトすることはできません。

ただし、git showそのファイルは、その内容をファイルにダンプして、その/another/path./deploy.shファイルを実行できることを意味します。

git-show HEAD:full/repo/path/to/deploy.sh > /another/path./deploy.sh
/another/path./deploy.sh

受信後のフックから実行するためgit-show、ファイルの最新バージョンが表示されdeploy.shます。


他の選択肢は試してみることです

 GIT_WORK_TREE=$SOURCE_PATH git checkout -- path/to/deploy.sh

そして、そのファイルだけを作業ツリーで直接チェックアウトします。

' --'は、gitコマンドがそれがファイルであり、タグや名前付きブランチのような別のパラメーターではないことを理解するのに役立ちます。

OP AlexKeyのテストから、作業ツリーが少なくとも1回(完全に)チェックアウトされている必要があります。

于 2012-11-28T10:35:25.773 に答える
3

私はこれがoooooooooldであることを知っていますが、この機能の独自のユースケースを見つけ、いくつかのソリューションを単純なワンライナーに組み合わせる前に、これに対するより良いソリューションをしばらく探しました。

GIT_WORK_TREE=/home/dev git checkout $branch -- deploy.sh

私の場合、すべてを解凍せずに、いくつかの裸のリポジトリを「覗き見」できるようにしたかっただけです(それらのいくつかは巨大です)。人々はまばらなチェックアウトや他のそのようなことについて話していましたが、私はただ一回限りの機能が必要でした。たとえば、「Documents / Health Records」フォルダだけをチェックアウトするには、次のようにします。

GIT_WORK_TREE=/tmp/my-files git checkout master -- "Documents/Health Records"

そして、見よ!そこに現れました。

于 2018-03-05T03:48:45.933 に答える
2

このgitshowまたは同様のgitcat-fileblobアプローチは、テキストファイルでは多かれ少なかれうまく機能しますが、バイナリファイルでは絶望的です。

あらゆる種類のファイルに対して確実に機能し、フォルダ全体をチェックアウトできる、より優れたアプローチ:

git archive mybranch folder/file.txt --output result.tar

必要なコンテンツ、つまりソース管理にあるファイルを含むtarアーカイブを作成します。バイナリファイルで完全に正常に動作します。

あなたがする必要がある唯一のことはこのtarファイルを抽出することです

tar -xf result.tar

詳細については、私のブログ投稿を参照してください

于 2013-02-27T21:48:28.167 に答える