リポジトリ外の場所に「チェックアウト」することは可能ですか?つまり、「。git」ディレクトリのないブランチのクローンです。
例:gitを使用してWebサイトを管理します。一部のファイルを編集し、WebDAVを介してファイルをコミットしてWebサーバーにコピーします。 WebDAV-pathはリポジトリの外の場所であり、「。git」を含むことはできません。
これはgitがビルドされた問題ではないかもしれませんが、これは可能ですか?
はい、これは確かに可能です。
宛先システム/サーバーに/srv/production.git
という名前の裸のリポジトリがあるとします。
宛先システムでは、コマンドcd /srv/production.git; GIT_WORK_TREE=/srv/production-www/ git checkout -f
を使用できます
裸のリポジトリにいる場合、コマンドは少し異なります。 /srv/testing
に裸のリポジトリがあるとします。 cd /srv/testing/.git; GIT_WORK_TREE=/srv/production-www/ git checkout -f
を使用することを確認するには
実際、私のシステムでは、production.git
リポジトリのpost-commitフックでこれを自動化しています。したがって、production.git
にプッシュすると、最新バージョンが自動的にWebルートにチェックアウトされます。
#!/bin/sh
#
# An example hook script that is called after a successful
# commit is made.
#
# To enable this hook, rename this file to "post-commit".
GIT_WORK_TREE=/srv/production-www/ git checkout -f
# ... misc other commands to verify permissions are set correctly.
リモートシステムへの唯一のアクセスがwebdavである場合、webdavホストに直接または一時的な場所にチェックアウトするポストコミットフックを記述して、アップロードのスクリプトを作成できることは確かに可能です。
ファイルだけが必要な場合は、 git archive
を使用できます。通常はtarballやZipのようなアーカイブに書き込みますが、それをパイプすることもできます。
git archive master | tar -x -C /some/path
ここで、master
は明らかにアーカイブするブランチであり、/some/path
にはファイルのみが含まれ、.git
または.gitignore
は含まれません。
または、ファイルの「チェックアウト」によりよく似た git checkout-index
を使用できます。
git checkout-index -f -a --prefix=/some/path/
ここで、-a
オプションはgit
にすべてのファイルをチェックアウトするように指示します。接頭辞は出力の先頭に追加されます。誰かが これのラッパー を書いてgit export
を与えました。
Git1.8.5なので、-C <path>
オプション。gitが現在の作業ディレクトリではなく<path>
で起動されたかのように実行します。
古いGitバージョンでは、--work-tree
オプションを使用します。例えば::
repo_url=https://github.com/owner/project.git
repo_dir=$(basename $repo_url .git)
git clone $repo_url
git --work-tree=$repo_dir checkout $branch