web-dev-qa-db-ja.com

Gitファイルをリポジトリ外の場所にチェックアウトする

リポジトリ外の場所に「チェックアウト」することは可能ですか?つまり、「。git」ディレクトリのないブランチのクローンです。

例:gitを使用してWebサイトを管理します。一部のファイルを編集し、WebDAVを介してファイルをコミットしてWebサーバーにコピーします。 WebDAV-pathはリポジトリの外の場所であり、「。git」を含むことはできません。

これはgitがビルドされた問題ではないかもしれませんが、これは可能ですか?

21
user240826

はい、これは確かに可能です。

宛先システム/サーバーに/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ホストに直接または一時的な場所にチェックアウトするポストコミットフックを記述して、アップロードのスクリプトを作成できることは確かに可能です。

19
Zoredache

ファイルだけが必要な場合は、 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を与えました。

6
slhck

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
0
Noam Manos