web-dev-qa-db-ja.com

ベアgitリポジトリを通常のリポジトリ(インプレース)に変換するにはどうすればよいですか?

裸のgitリポジトリがありますが、ssh経由で(ユーザーエクスペリエンスのようなファイルマネージャーで)そのコンテンツにアクセスして閲覧する必要があります。

私はそれをクローンできると思います:

git clone -l <path_to_bare_repo> <new_normal_repo>

ただし、リポジトリのサイズは約20GBで、複製するスペースがありません。ベアリポジトリをインプレースで変換して、作業コピーを作成する方法はありますか?

69
nyi

:これは、非常に単純な1コミットリポジトリでテストしました。これを再確認し、 manページ を読んでください。そして、StackOverflowで見つけたアドバイスに従う前に、常にバックアップをとって幸せです。 (バックアップしますか?)

--bareリポジトリを非ベアに変換するには:

  1. リポジトリの最上位に.gitフォルダーを作成します。
  2. リポジトリ管理物(HEAD branches config description hooks info objects refsなど)を作成した.gitに移動します。
  3. git config --local --bool core.bare falseを実行して、ローカルgitリポジトリを非ベアに変換します。
  4. TamásPapによるコメント経由)ステップ3の後、ブランチmaster(またはあなたのどちらかmain branch is)であり、すべてのファイルが削除され、削除がステージングされます。それは正常です。手動でmasterをチェックアウトするか、git reset --hardを実行すれば完了です。
  5. Royiによって報告された問題を解決するには.git/configの後にfetch = +refs/heads/*:refs/remotes/Origin/*の行を追加してurl = <...>ファイルを編集します[remote "Origin"]セクション。そうでない場合、git fetchOrigin/masterおよび他のOriginのブランチを表示しません。

これらの手順は、 この質問 、「git-convert normal to bare repository」の反対方向にあります-特に this answer 上記の手順(私はどちらの方向でも)はgit-cloneを実行することとdifferentであると述べています。しかし、それがあなたに関係があるかどうかはわかりませんが、質問でgit cloneに言及しました。

100
simont

私はわずかに異なるシナリオがありました:

溶液:

  • .git dirで、そのコンテンツのベアリポジトリを複製します。
    git clone --bare https://github.com/user/project .git
  • それを非ベアリポジトリとしてマークします。
    git config --local --bool core.bare false
  • インデックスをリセットします(そうでなければ、.gitbareリポジトリにはファイル '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 [〜#〜] =)の方が簡単です。

16
VonC

回答内の情報を単純化および結合するには:

ベアリポジトリを通常の.gitフォルダーとは異なる3つの違いがあります。

  • 設定ファイルでcore.bareがtrueに設定されている
  • インデックスファイルと作業ツリーが存在しません
  • 「Origin」リモートのデフォルトのrefspecは生成されません

そのため、ベアリポジトリを新しいフォルダーの.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間違った場所に誤って入力された場合に備えて、ファイルを生成します。

11
fuzzyTew

元のポスターの質問は、物事を簡単に行うのに十分なスペースがないことです。十分なスペースがある場合、答えははるかに簡単です。

git clone foo.git foo
6
sarnold

ディスク領域が少ない場合、通常のリポジトリに変換して作業ツリーを拡張することが問題になりますが、変換せずにベアリポジトリの内容を参照できます。つかいます git cat-file -p <commit-sha>コミット時に、それが参照するツリーを表示します。つかいます git cat-file -p <blob-sha> blobによって参照されるファイルの内容を表示します。つかいます git show <sha>:pathここで、shaはpathのblobの内容を表示するコミットまたはツリーです。

6
William Pursell

cdを裸のレポに入れて

  1. どちらか:
git config core.bare false
git reset --hard
  1. または
git clone X.git X

(Xという名前の通常のgitリポジトリを提供します)

2
nPcomp

別のワークツリーで作業してもかまわない場合は、

git worktree add ../repo2
cd ..
git status # now works fine

これはクローンではないことに注意してください。

2
Boaz Nahum

Push-to-Deploy

ベアリモートを標準のリポジトリに変換する代わりに、hooksディレクトリのpost-receiveスクリプトを使用して、リポジトリを展開ディレクトリに展開できます。

Push-to-Deployのセットアップの良い例です

参照しやすいように、これは上記のリンクのスクリプトコンテンツの例です。 「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}'"
0
Isaac Brown