どうすれば '通常の' Gitリポジトリをベアリポジトリに変換できますか?
主な違いは以下のようです。
通常のgitリポジトリでは、リポジトリ内にすべての関連データを含む.git
フォルダがあり、他のすべてのファイルが作業コピーを作成します。
裸のGitリポジトリには作業コピーはなく、フォルダ(repo.git
と呼びましょう)には実際のリポジトリデータが含まれています。
手短に言うと、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
を新しい場所にするのとは異なることに注意してください(下記参照)。
あなたの方法はうまくいくように見えます。ベアリポジトリのファイル構造は、.gitディレクトリ内にあるものだけです。しかし、ファイルのいずれかが実際に変更されているかどうかはわかりません。そのため、それが失敗した場合は、変更するだけで済みます。
git clone --bare /path/to/repo
名前の競合を避けるために、おそらく別のディレクトリでそれを実行する必要があるでしょう。そして、それをあなたが望むところに戻すことができます。そしてOriginのリポジトリがどこにあるかを指すように設定ファイルを変更する必要があるかもしれません。
次のリンクが参考になると思います
GitFaq:既存のベア以外のリポジトリをベアにするにはどうすればよいですか?
$ mv repo/.git repo.git
$ git --git-dir=repo.git config core.bare true
$ rm -rf repo
あなたが特にファイルシステム上でちょっとしたことをしたくないか、いじる必要がないのであれば、非ベアリポジトリのベアバージョンを作成するのは本当に簡単です(他のいくつかの記事で述べます)。これはgitのコア機能の一部です。
git clone --bare existing_repo_path bare_repo_path
使用も検討してください
git clone --mirror path_to_source_repository
ソースリポジトリのミラーを設定します。これは--bareを意味します。 --bareと比較して、 - mirrorはソースのローカルブランチをターゲットのローカルブランチにマッピングするだけでなく、すべての参照(リモート追跡ブランチ、メモなどを含む)をマッピングし、これらすべての参照がターゲットリポジトリのgitリモートアップデートによって上書きされます。
ネットワークパス上のリポジトリにプッシュしたいだけでしたが、そのリポジトリがベアとしてマークされていない限り、gitはそれを許可しません。必要なのは設定を変更することだけでした。
git config --bool core.bare true
きれいにしておきたいのでなければ、ファイルをいじる必要はありません。
私は答えを読みました、そして私はこれをしました:
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
のままにします
これが私が最も安全で簡単だと思うことです。上記に記載されていないものはここにありません。安全なステップバイステップの手順を示す答えを見たいだけです。裸にしたいリポジトリ(リポジトリ)から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
簡単に読む
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 が指摘しようとしたものです。きっと車輪を再発明することができます;-)
これは、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メッセージが表示され、ファイルシステムの変更は行われません。
ローカルチェックアウトブランチ/ refs/heads/*がほとんどなく、リモートブランチブランチが/ Origin/*をほとんど含まないリポジトリがある場合、および/ refs/heads/*にすべてのブランチを持つBAREリポジトリにこれを変換する場合
履歴を保存するには、次の操作を行います。
ファイルを削除して.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ページはあなたの友達です。
私は以下のスクリプトを使用して、私のすべての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経由で変更をプッシュするために必要です