私は裸の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 fetchorigin/masterこれらの手順は、この質問の反対方向、「通常のリポジトリを裸のリポジトリにgit-convert」です。特に、上記の手順(どちらの方向でも)はを実行するのとは異なると述べているこの回答に注意してください。それがあなたに関係があるかどうかはわかりませんが、あなたは質問で言及しました。git-clonegit clone
私は少し異なるシナリオを持っていました:
解決:
.gitdirにベアリポジトリのクローンを作成します。git clone --bare https://github.com/user/project .gitgit 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サブフォルダーで非ベアを実行すると、.git1つ上のレベルに移動する必要があります。ベアクローンを作成することで、必要な.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ファイルを取得するだけの通常のリポジトリのように動作するはずです。