私は裸のgitリポジトリを持っていますが、sshを介してそのコンテンツにアクセスして参照する必要があります(ユーザーエクスペリエンスのようなファイルマネージャーで)。
私はそれを複製できると思います:
git clone -l <path_to_bare_repo> <new_normal_repo>
ただし、私のリポジトリのサイズは約20GBであり、それを複製するスペースがありません。ベアリポジトリをインプレースで変換して、作業コピーを作成する方法はありますか?
注:これは非常に単純な1コミットリポジトリでテストしました。これを再確認し、マニュアルページを読んでください。また、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 normal to bare repository」とは反対の方向にあります。特に、上記の手順(どちらの方向でも)はを実行するのとは異なると述べているこの回答に注意してください。それがあなたに関係があるかどうかはわかりませんが、あなたは質問で言及しました。git-clone
git clone
少し異なるシナリオがありました:
解決:
.git
そのコンテンツのディレクトリにベアリポジトリのクローンを作成します。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フォルダーとは異なるものにする3つの違いがあります。
したがって、ベアリポジトリを移動して、新しいフォルダの.gitサブフォルダにすることができます。
mkdir clone
mv bare.git clone/.git
core.bareを変更します:
cd clone
git config --local --bool core.bare false
デフォルトのoriginrefspecを追加して、通常と同じデフォルトを作成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>
BLOBによって参照されるファイルの内容を確認するために使用します。git show <sha>:path
パスでblobの内容を確認するには、shaがコミットまたはツリーのいずれかである場合に 使用します。
cd
裸のレポに入れて
git config core.bare false
git reset --hard
git clone X.git X
(Xという名前の通常のgitリポジトリを提供します)
別のワークツリーで作業してもかまわない場合は、
git worktree add ../repo2
cd ..
git status # now works fine
これはクローンではないことに注意してください。
プッシュツーデプロイ
ベアリモートを標準リポジトリに変換するのではなく、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}'"