通常のGitリポジトリをベアリポジトリに変換する方法は?


603

「通常の」Gitリポジトリをベアリポジトリに変換するにはどうすればよいですか?

主な違いは次のようです:

  • 通常のGitリポジトリでは.git、リポジトリ内にすべての関連データと作業コピーを構成する他のすべてのファイルを含むフォルダーがあります

  • ベアGitリポジトリでは、作業コピーはなく、フォルダ(repo.git実際のリポジトリデータを含む)が含まれています


16
おそらくこれはより短い方法です:mv repo/.git repo.git; rm -rf repo
jameshfisher

そうですね。私が質問を書いたとき、これは私の歴史のほんの一部であり、私が先に実行したものです。
Boldewyn、2011年

54
@eegg 失敗した場合の&&代わりに使用!;mv

回答:


610

要するに:内容置き換えるrepoの内容をrepo/.git、その後、それが今裸のリポジトリであることをリポジトリに伝えます。

これを行うには、次のコマンドを実行します。

cd repo
mv .git ../repo.git # renaming just for clarity
cd ..
rm -fr repo
cd repo.git
git config --bool core.bare true

これはgit clone --bare、新しい場所へのの実行とは異なることに注意してください(以下を参照)。


9
のヒントをありがとうcore.bare。今、このオプションをグーグルした後、私はそれを確認できます:kernel.org/pub/software/scm/git-core/docs/git-config.html
Boldewyn

14
ありがとうございました!これは私にはきれいに思えます:mv repo / .git repo.git && rm -rf repo && cd repo.git && git config --bool core.bare true
JasonWoof

56
これは、以下の答え(git clone --bare /path/to/repo)よりもはるかに複雑で壊れやすいものです。
djd

7
そのrmコマンドは、ドットファイルとドッ​​トディレクトリを削除するため* \.[!.]*ではなく、必要になる場合があり*ます。
minopret 2012

6
@Ciantic:繰り返しになりますが、上記のコメントですでに説明したように、私の回答は3年前に出されましたが、5か月前に誰かが質問をまったく異なるものに編集しました。なしこのページの回答のは作りません任意のはもう意味が。その一連のコマンドは質問から直接コピーされたので、最後の2行を追加しました。
イェルクWミッターク

244

あなたの方法はうまくいくように見えます。ベアリポジトリのファイル構造は、.gitディレクトリ内にあるものです。しかし、実際に変更されたファイルがあるかどうかはわかりません。それで失敗した場合は、

git clone --bare /path/to/repo

名前の競合を回避するために、おそらく別のディレクトリでそれを実行する必要があるでしょう。そうすれば、必要な場所に戻すことができます。また、元のリポジトリがどこにあるかを指すように設定ファイルを変更する必要がある場合があります。


50
間違っていますが、この方法は同等ではありません。クローンを実行しても、構成オプションは保持されません。これは、git-p4を使用する場合など、適切な操作に不可欠な場合があります。さらに、クローンはリモートを破壊しますが、やはりgit-p4のようなものを使用すると、クローンを作成するとp4 / masterブランチが失われるため、上記のアプローチが推奨されます。
nosatalian 2010

26
ただし、構成ファイルのそれぞれの部分をコピーすることで、構成オプションを簡単に転送できます。この方法は、ファイルを手動でコピーして名前を変更するよりもクリーンだと私はまだ考えています。
フィリップ

6
git-svnは--bareのサポートを欠いているため、これはSubversionの移行後に最適です。
Keyo

11
名前の競合を避けるために---git clone --bare /path/to/repo.git /path/to/newbarerepo.git
raksja 2012

これはgit update-server-info、作成後にベアリポジトリで実行している限り機能します。
ACK_stoverflow 2017

116

次のリンクが役立つと思います

GitFaq:既存の裸でないリポジトリをどうやって裸にするのですか?

$ mv repo/.git repo.git
$ git --git-dir=repo.git config core.bare true
$ rm -rf repo

2
はい、それは私が検索したものです、ありがとう!ただし、2番目の提案(git clone)には、前述のノサタリアンの欠点があります。
Boldewyn 2010

1
あなたが提案したドキュメンテーションは続けて言っています、「より安全な方法は、Gitに次のようなことをすることですべての内部設定を処理させることです... git clone --bare -l <​​path_to_repos> <new_dir>」
dafunker

74

特にファイルシステムのビットをいじる必要がある場合を除き、ベアリポジトリ以外のバージョンのベアバージョンを作成するのは非常に簡単です(他のいくつかの投稿に記載されています)。これはgitのコア機能の一部です。

git clone --bare existing_repo_path bare_repo_path


6
4か月以上経過した後、遠方のベストアンサーの投票数が0になるのは驚くべきことです。あまり良くないが危険な「受け入れられた答え」は200です。
ステーブルドッグ2013

36
まったく驚くべきことではありません-この答えは、元の質問が尋ねたものとは異なります。リポジトリは変換されません。リポジトリのクローンが作成され、プロセス内の情報(たとえば、リモートブランチ)が失われます。
GreenAsJade 2013

15

ご利用もご検討ください

git clone --mirror path_to_source_repository

ドキュメントから:

ソースリポジトリのミラーをセットアップします。これは--bareを意味します。--bareと比較して、-mirrorはソースのローカルブランチをターゲットのローカルブランチにマップするだけでなく、すべての参照(リモート追跡ブランチ、ノートなどを含む)をマップし、これらすべての参照がrefspec構成になるように設定しますターゲットリポジトリのgitリモート更新によって上書きされます。


これは、OPが望むことを実行するための最も簡潔で完全かつ安全な方法のようです(対単にclone)。何か不足していますか?た--mirror比較的最近の付加は?
Craig Silver

@CraigSilver:いいえ、ドキュメントの履歴にそのような形式で表示されて--mirrorいるように、バージョン1.7から利用できるので、すでにかなり長いです。こちら
Jacek Krawczyk 2017

7

ネットワークパス上のリポジトリにプッシュしたいだけですが、そのリポジトリがベアとしてマークされていない限り、gitはそれを許可しませんでした。私が必要なのはその設定を変更することだけでした:

git config --bool core.bare true

クリーンに保ちたい場合を除き、ファイルをいじる必要はありません。


3
これは、リモートリポジトリの作業ツリーで作業する場合にも危険です。リモートワークツリーとインデックスがリポジトリと同期していないために、遅かれ早かれ変更を元に戻す可能性があります。何をしているのか正確にわからない場合は、このソリューションはお勧めしません。
Boldewyn、2016

確かに、リモートベアリポジトリのツリーで作業するべきではありません。
Slion

6

私は答えを読みました、そしてこれを行いました:

cd repos
mv .git repos.git
cd repos.git
git config --bool core.bare true # from another answer
cd ../
mv repos.git ../
cd ../
rm -rf repos/ # or delete using a file manager if you like

これはのコンテンツをrepos/.gitそのままにしますrepos.git


4

これが最も安全で簡単な方法だと思います。ここには、上記に記載されていないものはありません。安全なステップバイステップの手順を示す答えを見たいだけです。裸にするリポジトリ(repo)から1つのフォルダーを起動します。裸のリポジトリフォルダには.git拡張子があるという上記の暗黙の規則を採用しました。

(1) Backup, just in case.
    (a) > mkdir backup
    (b) > cd backup
    (c) > git clone ../repo
(2) Make it bare, then move it
    (a) > cd ../repo
    (b) > git config --bool core.bare true
    (c) > mv .git ../repo.git
(3) Confirm the bare repository works (optional, since we have a backup)
    (a) > cd ..
    (b) > mkdir test
    (c) > cd test
    (d) > git clone ../repo.git
(4) Clean up
    (a) > rm -Rf repo
    (b) (optional) > rm -Rf backup/repo
    (c) (optional) > rm -Rf test/repo

1
git cloneを使用してバックアップを作成したため、これはそれほど安全ではありません。クローン作成によるバックアップでは、一部の構成が失われる可能性があり、特定のケースではリポジトリにとって重要な場合があります。
リーライアン

了解しました。私が気にした唯一の構成は、すべてのローカルリポジトリに対してグローバルです。
sdesciencelover 2012

4

単に読む

Pro Git Book:4.2サーバーでのGit-サーバーでのGitの取得

煮詰めた

$ git clone --bare my_project my_project.git
Cloning into bare repository 'my_project.git'...
done.

次にmy_project.gitを置きますをサーバーに配置します

これは主に、回答#42が指摘しようとしたことです。確かに人は車輪を再発明することができました;-)


私は、この回答が追加するものを見ることはできません、それは周りの他の回答のいずれでも(賛成投票を含む)で任意の長さで議論されていません。明確にしていただけませんか?(ちなみに、プロGitブックでは「これはほぼ次のようなものと同等です...」とあり、その正確な大まかな同等性についてもここで既に説明されています。)
Boldewyn

3

以下は、UNIXベースのシステムで.bashrcまたは.profileに追加できる小さなBASH関数です。追加され、シェルはどちらか再起動されたか、ファイルがへの呼び出しを介して再ロードされたらsource ~/.profilesource ~/.bashrc

function gitToBare() {
  if [ -d ".git" ]; then
    DIR="`pwd`"
    mv .git ..
    rm -fr *
    mv ../.git .
    mv .git/* .
    rmdir .git

    git config --bool core.bare true
    cd ..
    mv "${DIR}" "${DIR}.git"

    printf "[\x1b[32mSUCCESS\x1b[0m] Git repository converted to "
    printf "bare and renamed to\n  ${DIR}.git\n"
    cd "${DIR}.git"
  else
    printf "[\x1b[31mFAILURE\x1b[0m] Cannot find a .git directory\n"
  fi
}

.gitディレクトリを含むディレクトリ内で呼び出されると、リポジトリを変換するための適切な変更が行われます。呼び出されたときに.gitディレクトリが存在しない場合、FAILUREメッセージが表示され、ファイルシステムの変更は行われません。


1

.gitディレクトリを移動してファイルを削除したりいじったりする方法はクリーンではなく、単純なことを行う "git"メソッドを使用しない。これは、通常のリポジトリをベアリポジトリに変換するために私が見つけた最もクリーンな方法です。

最初に/ path / to / normal / repoをrepo.gitと呼ばれる裸のリポジトリにクローンします

git clone --bare /path/to/normal/repo

次に、/ path / to / normal / repoを指す原点を削除します

cd repo.git
git remote rm origin

最後に、元のリポジトリを削除できます。その時点でrepo.gitの名前をrepoに変更することもできますが、gitリポジトリを示すための標準的な規則はsomething.gitなので、私はそのままにしておきます。

すべての作業を終えたら、新しいベアリポジトリのクローンを作成できます(これにより、実質的に通常のリポジトリが作成され、ベアリポジトリから通常のリポジトリに変換する方法にもなります)。

もちろん、他のアップストリームがある場合は、それらをメモして、それを含めるようにベアリポジトリを更新する必要があります。しかし、繰り返しになりますが、すべてgitコマンドで実行できます。manページはあなたの友達であることを忘れないでください。


1
あなたは他の答えを読むのに悩まされましたか?特に@jonescbと@nosatalianのコメントは?「git」メソッドは次のとおりです。「プレーンテキストファイルを可能な限り実行する」。.gitフォルダの内部を調査する必要があります。パーツがどのように組み合わされるかを学ぶことは非常に教育的です。
Boldewyn 2014年

1

ローカルチェックアウトブランチ/ refs / heads / *とリモートブランチブランチremotes / origin / *がほとんどないリポジトリがあり、すべてのブランチが/ refs / heads / *にあるBAREリポジトリに変換する場合

履歴を保存するには、次の操作を実行できます。

  1. ベアリポジトリを作成する
  2. ローカルチェックアウトブランチとリモートブランチがあるローカルリポジトリにcdします。
  3. git push / path / to / bare / repo + refs / remotes / origin / :refs / heads /

0

次のスクリプトを使用して、すべてのSVNリポジトリのリストが含まれるテキストファイルを読み取り、それらをGITに変換し、後でgit clone --bareを使用して裸のgitリポジトリに変換します

#!/bin/bash
file="list.txt"
while IFS= read -r repo_name
do
 printf '%s\n' "$repo_name"
 sudo git svn clone --shared --preserve-empty-dirs --authors-file=users.txt file:///programs/svn/$repo_name 
 sudo git clone --bare /programs/git/$repo_name $repo_name.git
 sudo chown -R www-data:www-data $repo_name.git
 sudo rm -rf $repo_name
done <"$file"

list.txtの形式は

repo1_name
repo2_name

また、users.txtの形式は

(no author) = Prince Rogers <prince.rogers.nelson@payesley.park.org>

www-dataはApache Webサーバーのユーザーであり、HTTP経由で変更をプッシュするには権限が必要です


0

ここでの定義である裸のリポジトリからgitglossaryは

ベアリポジトリは通常、適切に名前が付けられたディレクトリで、サフィックスが.gitで、リビジョン管理されているファイルのローカルにチェックアウトされたコピーはありません。つまり、通常は非表示の.gitサブディレクトリに存在するすべてのGit管理ファイルと制御ファイルは、代わりにrepository.gitディレクトリに直接存在し、他のファイルは存在せず、チェックアウトされません。通常、公開リポジトリの発行元は、ベアリポジトリを利用可能にします。

「ローカルリポジトリ」で遊んでいて、リモートリポジトリであるかのように自分がやりたいことができるようにしたかったので、ここに到着しました。私はただ遊んでいて、gitについて学びました。これは、この答えを読みたい人にとっては状況だと思います。

私しかし、それは単にファイルに行く(私が見つけたいくつかのgitのソースコードを臨検した後に)そのようだ、専門家の意見や、いくつかの特定の反例のために大好きだ.git/configと設定コア属性がむき出し、gitのは、あなたが何でもできるようになりますリモートでリポジトリにアクセスしたい。つまり、次の行が存在する必要があり.git/configます。

[core]
    ...
    bare = true
...

(これはコマンドがおおよそgit config --bool core.bare true行うことであり、おそらくより複雑な状況に対処するために推奨されます)

この主張の正当化は、gitソースコードでは、リポジトリが裸かどうかをテストする2つの異なる方法があるように見えることです。1つは、グローバル変数をチェックすることですis_bare_repository_cfg。これは、実行のセットアップフェーズ中に設定され、.git/configファイルで見つかった値を反映します。もう1つは関数is_bare_repository()です。この関数の定義は次のとおりです。

int is_bare_repository(void)
{
    /* if core.bare is not 'false', let's see if there is a work tree */
    return is_bare_repository_cfg && !get_git_work_tree();
} 

私は絶対に自信を持ってこれを言う時間も専門知識も持っていませんが、bare属性がtruein .git/configに設定されているかどうかを知ることができる限り、これは常に返され1ます。関数の残りの部分は、おそらく次の状況で使用されます。

  1. core.bareは未定義です(つまり、trueでもfalseでもありません)。
  2. ワークツリーがありません(つまり、.gitサブディレクトリがメインディレクトリです)

後でできるときは実験しますが、これはcore.bare = trueを設定することがcore.bareを削除することと同等であることを示しているように思われますファイルからしてディレクトリを適切に設定することと。

いずれにせよ、core.bare = trueに設定すると確実にプッシュできますが、プロジェクトファイルの存在によって他の操作がうまくいかないかどうかはわかりません。興味深いので、リポジトリにプッシュしてローカルで何が起こったかを確認する(つまり、実行git statusして結果を理解する)ことは有益だと思います。


-1

まず、backup既存のリポジトリ:

(a)  mkdir backup

(b)  cd backup

(c)  git clone non_bare_repo

次に、以下を実行します。

git clone --bare -l non_bare_repo new_bare_repo

中間クローンとは何ですか?
ステーブルドッグ2013

-4

上記のすべての操作を行うためのワンライナー:

for i in `ls -A .`; do if [ $i != ".git" ]; then rm -rf $i; fi; done; mv .git/* .; rm -rf .git; git config --bool core.bare true

(何かが爆発し、バックアップがない場合は私を責めないでください:P)


-9

うわー、何人の人がこれに賛成したのかは驚くべきことです。特に、なぜこの人が自分のしていることをしているのかを尋ねる独身者がいないとは思えません。

ベアgitリポジトリと非ベアgitリポジトリの唯一の違いは、非ベアバージョンには作業用コピーがあることです。ベアリポジトリが必要になる主な理由は、サードパーティで利用できるようにしたい場合、実際には直接作業できないため、ある時点でクローンを作成する必要があるためです。通常の作業コピーバージョンに戻します。

そうは言っても、ベアリポジトリに変換するには、保留中のコミットがないことを確認して、次のようにします。

rm -R * && mv .git/* . && rm -R .git

はい、ベアレポです。


11
これはそれを十分に裸にしないでしょう。押し込んでみてください。あなたgit config core.bare trueもそうする必要があります。
アントニーハッチキンス

私はdownvoteしませんでしたが、私はちょうど説明この答えの第一の部分ことを指摘したかった理由非裸の一方が対あなたは裸のレポを望むOK、それは十分な技術的な詳細が含まれていませんが、5月少し不正確。ただし、回答の2番目の部分では、これらのコマンドによってリポジトリが裸になるように設定されていますが、Anthonyは正しいのでgit config core.bare trueこの回答と同じように設定する必要があります
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.