655

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

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

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

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

4

18 に答える 18

682

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ください(以下を参照)。

于 2010-02-04T15:06:17.983 に答える
260

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

git clone --bare /path/to/repo

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

于 2010-02-04T13:26:10.767 に答える
123

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

GitFaq:既存の非ベアリポジトリをベアにする方法を教えてください。

$ mv repo/.git repo.git
$ git --git-dir=repo.git config core.bare true
$ rm -rf repo
于 2010-08-03T01:46:09.247 に答える
78

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

git clone --bare existing_repo_path bare_repo_path

于 2013-03-08T17:36:41.977 に答える
24

使用もご検討ください

git clone --mirror path_to_source_repository path_to_bare_repository

ドキュメントから:

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

于 2016-08-04T06:40:43.353 に答える
10

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

git config --bool core.bare true

あなたがそれをきれいに保ちたいのでなければ、ファイルをいじる必要はありません。

于 2016-02-24T06:30:13.853 に答える
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

于 2010-08-12T03:11:40.570 に答える
4

これが私が最も安全で最も簡単だと思うものです。ここに上記以外のものはありません。安全なステップバイステップの手順を示す答えを見たいだけです。公開したいリポジトリ(リポジトリ)から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
于 2011-10-14T16:03:31.900 に答える
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が指摘しようとしたものです。ひどく人は車輪の再発明をすることができます;-)

于 2015-11-04T15:42:22.000 に答える
3

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メッセージが表示され、ファイルシステムの変更は行われません。

于 2015-04-19T01:20:48.783 に答える
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コマンドで実行できます。マニュアルページはあなたの友達であることを忘れないでください。

于 2014-06-04T16:38:06.763 に答える
1

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

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

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

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です。関数の残りの部分は、おそらく次の状況のた​​めのものです。

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

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

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

于 2020-01-03T13:59:13.347 に答える
0

次のスクリプトを使用して、すべての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経由で変更をプッシュするには権限が必要です

于 2017-01-03T17:39:15.670 に答える
-1

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

(a)  mkdir backup

(b)  cd backup

(c)  git clone non_bare_repo

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

git clone --bare -l non_bare_repo new_bare_repo
于 2012-02-23T12:54:38.640 に答える
-1

追加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

于 2021-12-07T04:23:24.663 に答える
-5

上記のすべての操作を実行するための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)

于 2010-06-29T09:45:17.140 に答える
-9

うわー、これについて多くの人がチャイムを鳴らしたのは驚くべきことです。特に、なぜこの人が自分のしていることをしているのかを尋ねる人が一人もいないように思われることを考えると。

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

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

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

そこに行く、裸のリポジトリ。

于 2012-04-01T13:05:20.057 に答える