裸のgitリポジトリがありますが、ssh経由で(ユーザーエクスペリエンスのようなファイルマネージャーで)そのコンテンツにアクセスして閲覧する必要があります。
私はそれをクローンできると思います:
git clone -l <path_to_bare_repo> <new_normal_repo>
ただし、リポジトリのサイズは約20GBで、複製するスペースがありません。ベアリポジトリをインプレースで変換して、作業コピーを作成する方法はありますか?
注:これは、非常に単純な1コミットリポジトリでテストしました。これを再確認し、 manページ を読んでください。そして、StackOverflowで見つけたアドバイスに従う前に、常にバックアップをとって幸せです。 (バックアップしますか?)
--bare
リポジトリを非ベアに変換するには:
.git
フォルダーを作成します。HEAD branches config description hooks info objects refs
など)を作成した.git
に移動します。git config --local --bool core.bare false
を実行して、ローカルgitリポジトリを非ベアに変換します。master
(またはあなたのどちらかmain branch is)であり、すべてのファイルが削除され、削除がステージングされます。それは正常です。手動でmaster
をチェックアウトするか、git reset --hard
を実行すれば完了です。.git/config
の後にfetch = +refs/heads/*:refs/remotes/Origin/*
の行を追加してurl = <...>
ファイルを編集します[remote "Origin"]
セクション。そうでない場合、git fetch
はOrigin/master
および他のOriginのブランチを表示しません。これらの手順は、 この質問 、「git-convert normal to bare repository」の反対方向にあります-特に this answer 上記の手順(私はどちらの方向でも)はgit-clone
を実行することとdifferentであると述べています。しかし、それがあなたに関係があるかどうかはわかりませんが、質問でgit clone
に言及しました。
私はわずかに異なるシナリオがありました:
溶液:
.git
dirで、そのコンテンツのベアリポジトリを複製します。git clone --bare https://github.com/user/project .git
git config --local --bool core.bare false
.git
bareリポジトリにはファイル '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 -- .
しかし、私は 承認された解決策 ( 役立つgit reset
ステップを追加 by [〜#〜] adtc [〜#〜] =)の方が簡単です。
回答内の情報を単純化および結合するには:
ベアリポジトリを通常の.gitフォルダーとは異なる3つの違いがあります。
そのため、ベアリポジトリを新しいフォルダーの.gitサブフォルダーに移動するだけで、
mkdir clone
mv bare.git clone/.git
Core.bareを変更します。
cd clone
git config --local --bool core.bare false
デフォルトのOrigin 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>
blobによって参照されるファイルの内容を表示します。つかいます git show <sha>:path
ここで、shaはpathのblobの内容を表示するコミットまたはツリーです。
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
これはクローンではないことに注意してください。
Push-to-Deploy
ベアリモートを標準のリポジトリに変換する代わりに、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}'"