私は裸のgitリポジトリを持っていますが、sshを介してそのコンテンツにアクセスして参照する必要があります(ユーザーエクスペリエンスのようなファイルマネージャーで)。
私はそれを複製できると思います:
git clone -l <path_to_bare_repo> <new_normal_repo>
しかし、私のリポジトリのサイズは約20GBであり、それを複製するスペースがありません。ベアリポジトリをインプレースで変換して、作業コピーを作成する方法はありますか?
私は裸のgitリポジトリを持っていますが、sshを介してそのコンテンツにアクセスして参照する必要があります(ユーザーエクスペリエンスのようなファイルマネージャーで)。
私はそれを複製できると思います:
git clone -l <path_to_bare_repo> <new_normal_repo>
しかし、私のリポジトリのサイズは約20GBであり、それを複製するスペースがありません。ベアリポジトリをインプレースで変換して、作業コピーを作成する方法はありますか?
git show
およびgit cat-file
回答:
注:これは非常に単純な1コミットリポジトリでテストしました。これを再確認し、manページを読んでください。そして、StackOverflowで見つけたアドバイスに従う前に、バックアップしたことを常に確認してください。(あなたはバックアップしますよね?)
--bare
リポジトリを非ベアに変換するには:
.git
リポジトリの最上位レベルのフォルダを。HEAD branches config description hooks info objects refs
など)を.git
作成したばかりの場所に移動します。git config --local --bool core.bare false
して、ローカルのgit-repositoryを非ベアに変換します。master
(またはメインブランチのいずれか)にいることがわかり、すべてのファイルが削除され、削除がステージングされます。それは正常です。手動でチェックアウトmaster
するか、を実行するだけでgit reset --hard
完了です。.git/config
行fetch = +refs/heads/*:refs/remotes/origin/*
を追加するファイルを
編集します。それ以外の場合は、他のオリジンのブランチは表示されません。url = <...>
[remote "origin"]
git fetch
origin/master
これらの手順は、この質問の反対方向、「通常のリポジトリを裸のリポジトリにgit-convert」です。特に、上記の手順(どちらの方向でも)はを実行するのとは異なると述べているこの回答に注意してください。それがあなたに関係があるかどうかはわかりませんが、あなたは質問で言及しました。git-clone
git clone
私は少し異なるシナリオを持っていました:
解決:
.git
dirにベアリポジトリのクローンを作成します。git clone --bare https://github.com/user/project .git
git config --local --bool core.bare false
.git
ベアリポジトリにはファイルが含まれていないため、すべてが削除されたと見なされます ' index
'。)git reset HEAD -- .
.git/index
ます。以前に取得したコンテンツを保持しながら、ベアリポジトリを非ベアリポジトリに効果的に変換しました。完全なスクリプト私が長年使ってきたが手順が含まれます。
cd /path/to/current/worktree
# That creates a .git directly at the right place
git clone --bare /url/of/repo .git
# restore the link between the local repo and its upstream remote repo
git config --local --bool core.bare false
git config --local remote.origin.fetch +refs/heads/*:refs/remotes/origin/*
git fetch origin
git branch -u origin/master master
# reset the index (not the working tree)
git reset HEAD -- .
しかし、私は受け入れられた解決策(ADTCによって追加された有用なgit reset
ステップを使用)がより簡単であることを確認します。
.git
最初はアーカイブ(git以外)から作成された作業ツリー(リポジトリであることがわかっている)にサブフォルダーを作成することです。チェックアウトを行っていたフォルダーが空ではないため、ベア以外のリポジトリをチェックアウトできませんでした。git clone --no-checkout
サブフォルダーで非ベアを実行すると、.git
1つ上のレベルに移動する必要があります。ベアクローンを作成することで、必要な.git
場所にサブフォルダーを直接作成できました。:あなたはここで見ることができますスクリプトgithub.com/VonC/compileEverything/blob/...
.git
。不足しているのはそのすべてです。私は.git
ベアクローンを通過し、その.git
フォルダーを非ベアクローンに変換git reset
し、作業ツリーがすでに存在することをgitに認識させるために実行します。それはまさにgithub.com/VonC/compileEverything/blob/…が行うことです。
回答の情報を単純化して組み合わせるには:
ベアリポジトリが通常の.gitフォルダーと異なる点は3つあります。
したがって、ベアリポジトリを移動して新しいフォルダの.gitサブフォルダにすることができます。
mkdir clone
mv bare.git clone/.git
core.bareを変更します。
cd clone
git config --local --bool core.bare false
デフォルトのオリジンrefspecを追加して、通常と同じデフォルトを作成git fetch
およびgit push
選択します。
git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'
そして、インデックスファイルと作業ツリーを生成します。
git checkout master
誤って間違った場所に入力された場合に備えて、ファイルを生成するのではgit checkout
なく、お勧めgit reset
します。
元のポスターの質問は、物事を簡単な方法で行うのに十分なスペースがないことです。十分なスペースがある場合、答えははるかに簡単です。
git clone foo.git foo
ディスク容量が不足している場合は、通常のリポジトリに変換して作業ツリーを拡張することが問題になりますが、変換せずにベアリポジトリのコンテンツを参照できます。git cat-file -p <commit-sha>
コミットで使用して、それが参照するツリーを確認します。git cat-file -p <blob-sha>
ブロブによって参照されるファイルの内容を確認するために使用します。git show <sha>:path
パスでblobの内容を確認するには、shaがコミットまたはツリーのいずれかである場合に使用します。
cd
裸のレポに入れて
git config core.bare false
git reset --hard
git clone X.git X
(Xという名前の通常のgitリポジトリを提供します)
プッシュツーデプロイ
ベアリモートを標準リポジトリに変換するのではなく、hooksディレクトリのpost-receiveスクリプトを使用して、リポジトリをデプロイメントディレクトリに展開できます。
参照しやすいように、これは上記のリンクのスクリプトコンテンツの例です。「master」ブランチから、リポジトリの親ディレクトリと同じレベルにある「deploy」という名前のディレクトリにプッシュのみをデプロイします。
#!/usr/bin/env ruby
# post-receive
# 1. Read STDIN (Format: "from_commit to_commit branch_name")
from, to, branch = ARGF.read.split " "
# 2. Only deploy if master branch was pushed
if (branch =~ /master$/) == nil
puts "Received branch #{branch}, not deploying."
exit
end
# 3. Copy files to deploy directory
deploy_to_dir = File.expand_path('../deploy')
`GIT_WORK_TREE="#{deploy_to_dir}" git checkout -f master`
puts "DEPLOY: master(#{to}) copied to '#{deploy_to_dir}'"
.git
ディレクトリに移動し、構成のbare
パラメータをfalseに設定すると、git checkout
ファイルを取得するだけの通常のリポジトリのように動作するはずです。