86

私は裸のgitリポジトリを持っていますが、sshを介してそのコンテンツにアクセスして参照する必要があります(ユーザーエクスペリエンスのようなファイルマネージャーで)。

私はそれを複製できると思います:

git clone -l <path_to_bare_repo> <new_normal_repo>

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

4

8 に答える 8

126

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

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

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

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

于 2012-05-17T14:39:39.837 に答える
20

少し異なるシナリオがありました:

解決:

  • .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ステップを使用)がより簡単であることを確認します。

于 2013-05-16T08:50:16.390 に答える
12

回答の情報を単純化して組み合わせるには:

ベアリポジトリを通常の.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

デフォルトのoriginrefspecを追加して、通常と同じデフォルトを作成git fetchおよび選択します。git push

git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'

そして、インデックスファイルと作業ツリーを生成します。

git checkout master

誤って間違った場所に入力された場合に備えて、ファイルを生成するのgit checkoutではなく、お勧めします。git reset

于 2016-04-25T15:06:51.343 に答える
12

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

git clone foo.git foo
于 2017-01-26T20:45:38.773 に答える
6

ディスク容量が不足している場合は、通常のリポジトリに変換して作業ツリーを拡張することが問題になりますが、変換せずにベアリポジトリのコンテンツを参照できます。コミットで使用git cat-file -p <commit-sha>して、それが参照するツリーを確認します。git cat-file -p <blob-sha>BLOBによって参照されるファイルの内容を確認するために使用します。git show <sha>:pathパスでblobの内容を確認するには、shaがコミットまたはツリーのいずれかである場合に 使用します。

于 2012-05-17T14:49:56.157 に答える
5

cd裸のレポに入れて

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

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

于 2018-01-31T03:41:10.420 に答える
2

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

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

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

于 2017-08-28T12:30:04.227 に答える
0

プッシュツーデプロイ

ベアリモートを標準リポジトリに変換するのではなく、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}'"
于 2019-01-31T18:06:02.200 に答える