「通常の」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
ください(以下を参照)。
あなたの方法はうまくいくように見えます。ベアリポジトリのファイル構造は、.gitディレクトリ内にあるものです。しかし、実際に変更されたファイルがあるかどうかはわかりません。それが失敗した場合は、次のようにすることができます。
git clone --bare /path/to/repo
名前の競合を避けるために、おそらく別のディレクトリでそれを行う必要があります。そうすれば、目的の場所に戻すことができます。また、元のリポジトリがどこにあるかを指すように構成ファイルを変更する必要がある場合があります。
次のリンクが役立つと思います
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 path_to_bare_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メッセージが表示され、ファイルシステムの変更は行われません。
ファイルを削除し、.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コマンドで実行できます。マニュアルページはあなたの友達であることを忘れないでください。
ローカルのチェックアウトブランチ/refs/ heads/*とリモートブランチブランチremotes/origin / *がほとんどないリポジトリがあり、これを/ refs / heads/*にすべてのブランチがあるBAREリポジトリに変換する場合
履歴を保存するには、次の手順を実行できます。
gitglossaryからのベアリポジトリの定義は次のとおりです。
ベアリポジトリは通常、適切な名前のディレクトリで、.gitサフィックスが付いており、リビジョン管理下にあるファイルのローカルでチェックアウトされたコピーはありません。つまり、通常は非表示の.gitサブディレクトリに存在するすべてのGit管理ファイルと制御ファイルは、代わりにrepository.gitディレクトリに直接存在し、他のファイルは存在せず、チェックアウトされません。通常、公開リポジトリの発行者は、裸のリポジトリを利用可能にします。
「ローカルリポジトリ」で遊んでいて、リモートリポジトリのようにやりたいことができるようにしたかったので、ここに到着しました。私はただ遊んでいて、gitについて学ぼうとしていました。これが、この答えを読みたい人にとっての状況だと思います。
専門家の意見や特定の反例が欲しいのですが、(私が見つけたgitソースコードを調べた後)ファイルに移動してコア属性をtrue.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
ているかどうかを知る限り.git/config
、これは常にを返すはず1
です。関数の残りの部分は、おそらく次の状況のためのものです。
後でできるときに試してみますが、これは、core.bare = trueを設定することは、設定ファイルからcore.bareを削除し、ディレクトリを適切に設定することと同じであることを示しているようです。
いずれにせよ、core.bare = trueに設定すると、確実にプッシュできますが、プロジェクトファイルが存在すると、他の操作が失敗するかどうかはわかりません。興味深いことであり、リポジトリにプッシュしてローカルで何が起こったかを確認する(つまり、実行git status
して結果を理解する)ことは有益だと思います。
次のスクリプトを使用して、すべてのSVNリポジトリのリストを含むテキストファイルを読み取り、それらをGITに変換し、後でgitclone--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はApacheWebサーバーユーザーです。HTTP経由で変更をプッシュするには権限が必要です
まず、backup
既存のリポジトリ:
(a) mkdir backup
(b) cd backup
(c) git clone non_bare_repo
次に、以下を実行します。
git clone --bare -l non_bare_repo new_bare_repo
追加2:
答えを書いた後、受け入れられた答えは、後に続く場合、私のPCで同じ結果になる可能性が高いことに気づきましたgit add *
。
作業フォルダ(左のみ)からファイルが消えてしまいました.git
。これもまた、次のようにすてきでコンパクトです。
git switch --orphan some_new_branch_name
次に、必要に応じてベアに変換します。
git config --bool core.bare true
このようにして、リモートリンクを含む構成が保持されます。
$ git config --list
core.repositoryformatversion=0
core.filemode=true
core.bare=true
remote.origin.url=https://github.com/vmatare/thinkfan.git
remote.origin.fetch=+refs/*:refs/*
remote.origin.mirror=true
追加:
コメントでは、「gitを無視したファイル」は削除されないと記載されています。そのような場合は、手動で追加で削除する必要があります(または、.git
サブフォルダーであるリポジトリ自体を別の場所に移動します)。
注:一部のアクションでエラーが発生する
前:core.bare true
$ git fetch --all
Fetching origin
fatal: Refusing to fetch into current branch refs/heads/devel of non-bare repository
error: Could not fetch origin
some_new_branch_name
その後の出力には記載されていませんgit branch
。さらにテストするためgit checkout master
に、ファイルを取得しましたがsome_new_branch_name
、の出力はありませんでした。そこで、何らかの作業が行われない限り(および/またはコミットが実行されない限り)、git branch
新しいブランチはリポジトリに追加されないと思います。orphan
上記のすべての操作を実行するためのOneliner:
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)
うわー、これについて多くの人がチャイムを鳴らしたのは驚くべきことです。特に、なぜこの人が自分のしていることをしているのかを尋ねる人が一人もいないように思われることを考えると。
ベアと非ベアのgitリポジトリの唯一の違いは、非ベアバージョンには作業コピーがあることです。ベアレポが必要になる主な理由は、サードパーティが利用できるようにする場合、実際に直接作業することはできないため、ある時点でクローンを作成する必要があるためです。通常の作業コピーバージョンに戻ります。
そうは言っても、ベアリポジトリに変換するには、保留中のコミットがないことを確認してから、次のようにするだけです。
rm -R * && mv .git/* . && rm -R .git
そこに行く、裸のリポジトリ。