回答:
あたりとして(「SVNのエクスポート」のような)「gitの輸出」しますか?
git checkout-index
そのために使用できます。これは低レベルのコマンドです。すべてをエクスポートしたい場合は-a
、
git checkout-index -a -f --prefix=/destination/path/
manページを引用するには:
最後の "/" [プレフィックス]は重要です。エクスポートされた名前は、文字通り、指定された文字列が前に付けられます。
特定のディレクトリをエクスポートする場合は、いくつかのトリックが関係しています。このコマンドは、ディレクトリではなく、ファイルのみを取ります。ディレクトリに適用するには、「find」コマンドを使用して、出力をgitにパイプします。
find dirname -print0 | git checkout-index --prefix=/path-to/dest/ -f -z --stdin
また、manページから:
ここでは直観性は目標ではありません。再現性です。
GIT_WORK_TREE=../path/to/place git checkout
git worktree
(下記参照)imhoは今日の正解であり、ここに追加される場合があります。
もう少しクリーンな別の解決策-別の作業ツリーを指定するだけです。
HEAD(インデックスではない)から特定のoutディレクトリまですべてをチェックアウトするには:
git --work-tree=/path/to/outputdir checkout HEAD -- .
HEADから特定のディレクトリにサブディレクトリまたはファイルをチェックアウトするには:
git --work-tree=/path/to/outputdir checkout HEAD -- subdirname
--work-tree=/home/thomasg/okcopy
、--work-tree=~/okcopy
(同じgitツリー内に座っている間に相対パスを使用することもできgit status
ますが、R'lyehianには狂気と出力があります)
git status
多くのmodを表示します(おそらく、インデックスが他のディレクトリと一致し、手つかずの通常の作業ツリーと一致しないためと考えられます)。git reset
それを良い状態に戻しました。
git status
は多くのモッドを示し、git reset
助けにはなりません。そうしなければならなかったgit checkout -f HEAD
レポの状態を復元するた。
fatal: This operation must be run in a work tree
git reset
、メインの作業ツリーを正常に戻すには十分です。メインの作業ツリーを変更せずに、任意のSHA1、ブランチ、またはタグでリポジトリサブディレクトリを安全にエクスポートするには、Charles Baileyの 悪名高いgit archive
ソリューションを参照してください。同様に、同時に複数のブランチを安全にチェックアウトするには、新しいgit worktree add
サブコマンドがあなたの友達です。
単一ファイルの場合:
git show HEAD:abspath/to/file > file.copy
SHA1 ID
を介して簡単に見つけることができるものを指しgitk
ます。私は一時的な場所に「チェックアウト」というファイルを(つまり、元に戻すせず)に必要がある場合は、私が使用しますshow
:サブコマンドgit show 82e54378856215ef96c5db1ff1160a741b5dcd70:MyProj/proguard/mapping.txt > myproj_mapping.txt
ツリーの特定のタグ付きバージョンをチェックアウトする必要があったため、上記の解決策は私にとってはうまくいきませんでした。cvs export
ちなみに、それが使用方法です。 git checkout-index
インデックスからファイルをチェックアウトするため、タグ引数を取りません。 git checkout <tag>
作業ツリーに関係なくインデックスを変更するため、元のツリーをリセットする必要があります。私にとってうまくいった解決策は、リポジトリを複製することでした。共有クローンは非常に高速で、余計なスペースを取りません。.git
必要に応じて、ディレクトリを削除できます。
git clone --shared --no-checkout <repository> <destination>
cd <destination>
git checkout <tag>
rm -rf .git
新しいバージョンのgitはgit clone --branch <tag>
、指定されたタグを自動的にチェックアウトすることをサポートする必要があります。
git clone --shared --branch <tag> <repository> <destination>
rm -rf <destination>/.git
git --work-tree=/path/to/outputdir checkout <tag> -- .
うまくいきませんでしたか?
自分の機能で作業していて、チェックアウトしてマスターに戻りたくない場合は、次のコマンドを実行できます。
cd ./myrepo
git worktree add ../myrepo_master master
git worktree remove ../myrepo_master
ブランチコミットで../myrepo_master
ディレクトリを作成しmaster
、作業を続行できます
git --work-tree=/path/to/outputdir checkout HEAD -- .
、インデックスに対して何もしないのとは異なり、選択したブランチを指定した場所にコピーするだけです(.gitファイルを追加します)。
myrepo_master
ディレクトリを削除
git worktree remove ../myrepo_master
エイドリアンの答えは「致命的:この操作は作業ツリーで実行されなければならない」を投げた。以下は私たちのために働いたものです。
git worktree add <new-dir> --no-checkout --detach
cd <new-dir>
git checkout <some-ref> -- <existing-dir>
ノート:
--no-checkout
新しいワークツリーには何もチェックアウトしないでください。--detach
新しいワークツリーの新しいブランチを作成しないでください。<some-ref>
たとえば、あらゆるrefで動作します。 HEAD~1
ます。git worktree prune
。@hasenの回答への追加。チェックアウトするファイルを一覧表示するには、次git ls-files
のfind
ような代わり に使用したい場合があります。
git ls-files -z *.txt | git checkout-index --prefix=/path-to/dest/ -f -z --stdin
-z
!特定の種類のインジェクション攻撃に対して脆弱ではないスクリプトを提供できてうれしいです。
これを実現するためにgitエイリアスを定義しました(この質問を見つける前に)。
これは、現在のパスを保存し、git repoに切り替え、チェックアウトを実行し、開始した場所に戻る短いbash関数です。
git checkto開発〜/ my_project_git
これは、たとえば、開発ブランチを「〜/ my_project_git」ディレクトリにチェックアウトします。
これは内部のエイリアスコードです~/.gitconfig
:
[alias]
checkTo = "!f(){ [ -z \"$1\" ] && echo \"Need to specify branch.\" && \
exit 1; [ -z \"$2\" ] && echo \"Need to specify target\
dir\" && exit 2; cDir=\"$(pwd)\"; cd \"$2\"; \
git checkout \"$1\"; cd \"$cDir\"; };f"
一時ディレクトリのブランチをチェックアウトするためにこのエイリアスを使用しています:
[alias]
cot = "!TEMP=$(mktemp -d); f() { git worktree prune && git worktree add $TEMP $1 && zsh -c \"cd $TEMP; zsh\";}; f" # checkout branch in temporary directory
使用法:
git cot mybranch
その後、ブランチで作業できる一時ディレクトリの新しいシェルにドロップされます。このディレクトリでgitコマンドを使用することもできます。
完了したら、ディレクトリを削除して実行します。
git worktree prune
これは、新しいワークツリーを追加する前に、エイリアスでも自動的に行われます。