web-dev-qa-db-ja.com

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

どうすれば '通常の' Gitリポジトリをベアリポジトリに変換できますか?

主な違いは以下のようです。

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

  • 裸のGitリポジトリには作業コピーはなく、フォルダ(repo.gitと呼びましょう)には実際のリポジトリデータが含まれています。

564
Boldewyn

手短に言うと、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を新しい場所にするのとは異なることに注意してください(下記参照)。

558
Jörg W Mittag

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

git clone --bare /path/to/repo

名前の競合を避けるために、おそらく別のディレクトリでそれを実行する必要があるでしょう。そして、それをあなたが望むところに戻すことができます。そしてOriginのリポジトリがどこにあるかを指すように設定ファイルを変更する必要があるかもしれません。

235
jonescb

次のリンクが参考になると思います

GitFaq:既存のベア以外のリポジトリをベアにするにはどうすればよいですか?

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

あなたが特にファイルシステム上でちょっとしたことをしたくないか、いじる必要がないのであれば、非ベアリポジトリのベアバージョンを作成するのは本当に簡単です(他のいくつかの記事で述べます)。これはgitのコア機能の一部です。

git clone --bare existing_repo_path bare_repo_path

64
Chip Kaye

使用も検討してください

git clone --mirror path_to_source_repository

のドキュメントから

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

10
Jacek Krawczyk

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

git config --bool core.bare true

きれいにしておきたいのでなければ、ファイルをいじる必要はありません。

7
Slion

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

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のままにします

6
Dan D.

これが私が最も安全で簡単だと思うことです。上記に記載されていないものはここにありません。安全なステップバイステップの手順を示す答えを見たいだけです。裸にしたいリポジトリ(リポジトリ)から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
4
sdesciencelover

簡単に読む

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 が指摘しようとしたものです。きっと車輪を再発明することができます;-)

4
apos

これは、UNIXベースのシステムの.bashrcまたは.profileに追加できる小さなBASH関数です。一度追加されてシェルが再起動されるか、source ~/.profileまたはsource ~/.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メッセージが表示され、ファイルシステムの変更は行われません。

3
nyteshade

ローカルチェックアウトブランチ/ refs/heads/*がほとんどなく、リモートブランチブランチが/ Origin/*をほとんど含まないリポジトリがある場合、および/ refs/heads/*にすべてのブランチを持つBAREリポジトリにこれを変換する場合

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

  1. ベアリポジトリを作成する
  2. ローカルチェックアウトブランチとリモートブランチを持つローカルリポジトリにcdします。
  3. git Push /パス/ to/bare/repo +参照/リモート/ Origin /:参照/ヘッド/
1
Senthil A Kumar

ファイルを削除して.gitディレクトリを移動させることで考える方法は、きれいではなく、「git」メソッドを使用して簡単なことはしないでください。これは私が普通のレポをベアレポに変換するために見つけた最もきれいな方法です。

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

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

次に/ path/to/normal/repoを指すOriginを削除します

cd repo.git
git remote rm Origin

最後に元のリポジトリを削除できます。その時点でrepo.gitの名前をrepoに変更することもできますが、gitリポジトリを意味する標準的な規約はsomething.gitなので、私は個人的にそのままにします。

すべて完了したら、新しいベアレポを複製することができます(これにより、通常のレポが作成されます。また、ベアからノーマルに変換する方法もあります)。

もちろん、あなたが他のアップストリームを持っているなら、それらをメモして、それを含むようにあなたの裸のリポジトリを更新したいでしょう。しかし、やはり、すべてgitコマンドで実行できます。 manページはあなたの友達です。

1
krux

私は以下のスクリプトを使用して、私のすべての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 <[email protected]>

www-dataはApache Webサーバーのユーザーです。許可はHTTP経由で変更をプッシュするために必要です

0
Pedro Vicente