「通常の」Gitリポジトリをベアリポジトリに変換するにはどうすればよいですか?
主な違いは次のようです:
通常のGitリポジトリでは
.git
、リポジトリ内にすべての関連データと作業コピーを構成する他のすべてのファイルを含むフォルダーがありますベアGitリポジトリでは、作業コピーはなく、フォルダ(
repo.git
実際のリポジトリデータを含む)が含まれています
「通常の」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
、新しい場所へのの実行とは異なることに注意してください(以下を参照)。
core.bare
。今、このオプションをグーグルした後、私はそれを確認できます:kernel.org/pub/software/scm/git-core/docs/git-config.html
git clone --bare /path/to/repo
)よりもはるかに複雑で壊れやすいものです。
rm
コマンドは、ドットファイルとドットディレクトリを削除するため* \.[!.]*
ではなく、必要になる場合があり*
ます。
あなたの方法はうまくいくように見えます。ベアリポジトリのファイル構造は、.gitディレクトリ内にあるものです。しかし、実際に変更されたファイルがあるかどうかはわかりません。それで失敗した場合は、
git clone --bare /path/to/repo
名前の競合を回避するために、おそらく別のディレクトリでそれを実行する必要があるでしょう。そうすれば、必要な場所に戻すことができます。また、元のリポジトリがどこにあるかを指すように設定ファイルを変更する必要がある場合があります。
git clone --bare /path/to/repo.git /path/to/newbarerepo.git
git update-server-info
、作成後にベアリポジトリで実行している限り機能します。
次のリンクが役立つと思います
GitFaq:既存の裸でないリポジトリをどうやって裸にするのですか?
$ mv repo/.git repo.git
$ git --git-dir=repo.git config core.bare true
$ rm -rf repo
git clone
)には、前述のノサタリアンの欠点があります。
特にファイルシステムのビットをいじる必要がある場合を除き、ベアリポジトリ以外のバージョンのベアバージョンを作成するのは非常に簡単です(他のいくつかの投稿に記載されています)。これはgitのコア機能の一部です。
git clone --bare existing_repo_path bare_repo_path
ご利用もご検討ください
git clone --mirror path_to_source_repository
ドキュメントから:
ソースリポジトリのミラーをセットアップします。これは--bareを意味します。--bareと比較して、-mirrorはソースのローカルブランチをターゲットのローカルブランチにマップするだけでなく、すべての参照(リモート追跡ブランチ、ノートなどを含む)をマップし、これらすべての参照がrefspec構成になるように設定しますターゲットリポジトリのgitリモート更新によって上書きされます。
clone
)。何か不足していますか?た--mirror
比較的最近の付加は?
--mirror
いるように、バージョン1.7から利用できるので、すでにかなり長いです。こちら
ネットワークパス上のリポジトリにプッシュしたいだけですが、そのリポジトリがベアとしてマークされていない限り、gitはそれを許可しませんでした。私が必要なのはその設定を変更することだけでした:
git config --bool core.bare true
クリーンに保ちたい場合を除き、ファイルをいじる必要はありません。
これが最も安全で簡単な方法だと思います。ここには、上記に記載されていないものはありません。安全なステップバイステップの手順を示す答えを見たいだけです。裸にするリポジトリ(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
単に読む
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メッセージが表示され、ファイルシステムの変更は行われません。
.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ページはあなたの友達であることを忘れないでください。
.git
フォルダの内部を調査する必要があります。パーツがどのように組み合わされるかを学ぶことは非常に教育的です。
ローカルチェックアウトブランチ/ refs / heads / *とリモートブランチブランチremotes / origin / *がほとんどないリポジトリがあり、すべてのブランチが/ refs / heads / *にあるBAREリポジトリに変換する場合
履歴を保存するには、次の操作を実行できます。
次のスクリプトを使用して、すべての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経由で変更をプッシュするには権限が必要です
ここでの定義である裸のリポジトリから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
属性がtrue
in .git/config
に設定されているかどうかを知ることができる限り、これは常に返され1
ます。関数の残りの部分は、おそらく次の状況で使用されます。
後でできるときは実験しますが、これはcore.bare = trueを設定することがcore.bareを削除することと同等であることを示しているように思われますファイルからしてディレクトリを適切に設定することと。
いずれにせよ、core.bare = trueに設定すると確実にプッシュできますが、プロジェクトファイルの存在によって他の操作がうまくいかないかどうかはわかりません。興味深いので、リポジトリにプッシュしてローカルで何が起こったかを確認する(つまり、実行git status
して結果を理解する)ことは有益だと思います。
まず、backup
既存のリポジトリ:
(a) mkdir backup
(b) cd backup
(c) git clone non_bare_repo
次に、以下を実行します。
git clone --bare -l non_bare_repo new_bare_repo
うわー、何人の人がこれに賛成したのかは驚くべきことです。特に、なぜこの人が自分のしていることをしているのかを尋ねる独身者がいないとは思えません。
ベアgitリポジトリと非ベアgitリポジトリの唯一の違いは、非ベアバージョンには作業用コピーがあることです。ベアリポジトリが必要になる主な理由は、サードパーティで利用できるようにしたい場合、実際には直接作業できないため、ある時点でクローンを作成する必要があるためです。通常の作業コピーバージョンに戻します。
そうは言っても、ベアリポジトリに変換するには、保留中のコミットがないことを確認して、次のようにします。
rm -R * && mv .git/* . && rm -R .git
はい、ベアレポです。
git config core.bare true
もそうする必要があります。
git config core.bare true
、この回答と同じように設定する必要があります。
mv repo/.git repo.git; rm -rf repo