「git --bare init」リポジトリをどのように使用しますか?


321

中央のGitリポジトリを作成する必要がありますが、少し混乱しています...

私は裸のリポジトリを(私のgitサーバー、マシン2に)作成しました:

$ mkdir test_repo
$ git --bare init

次に、ローカルリポジトリ(マシン1)からベアリポジトリ(マシン2)にファイルをプッシュする必要があります。SSHでマシン2にアクセスできます。事は私が裸のリポジトリの概念を理解していないと思うことです...

コードをベアリポジトリに保存する正しい方法は何ですか?ローカルリポジトリからベアリポジトリに変更をプッシュするにはどうすればよいですか?

中央リポジトリーを使用してベア・リポジトリーを作成する正しい方法はありますか?

私はこの主題について少し混乱しています。これについて手がかりをください。

回答:


392

まず、確認するために、実行する前に、作成したディレクトリに移動する必要がありますgit init --bare。また、ベアリポジトリに拡張子を付けるのが一般的です.git。だからできる

git init --bare test_repo.git

Gitバージョン<1.8の場合は、

mkdir test_repo.git
cd test_repo.git
git --bare init

後の質問に答えるために、ベアリポジトリ(定義上)にはワーキングツリーがアタッチされていないため、通常の非ベアリポジトリの場合と同様に(たとえば、git add <file>git commit。 )

ほとんどの場合git push、別のリポジトリからを使用して(を使用して)ベアリポジトリを更新します。

この場合、最初に他の人にリポジトリへのプッシュを許可する必要があることに注意してください。中にいるときはtest_repo.git

git config receive.denyCurrentBranch ignore

コミュニティ編集

git init --bare --shared=group

prasanthvがコメントしたように、これは、個人のホームプロジェクトではなく、職場でこれを行う場合に必要なことです。


7
他の人にこのレポへのプッシュを計画し--sharedているinit場合のオプションを追加することもできます。リポジトリにグループ書き込み権限を自動的に追加します- リンク
prasanthv

17
これらの3行は、この1行と同じ効果があると思います:git --bare init test_repo.git少なくとも私の現在のgitバージョン(1.8.2.2)では
Fran Marzoa

1
便利なあなたは裸と非裸のレポとの違いを知りたい場合はstackoverflow.com/questions/7861184/...
Guilleアコスタ

作業ツリーがない場合、gitはどのように検索しますか?私はgitオブジェクトストアに作業ツリーがあると思いました。ステージングSHAがポイントし、コミットするポイントはこれです
akantoword

@akantoword:gitはコミットとブランチに関するすべての情報をどこかに保存します。コミットはおそらく、ほとんどの場合、ファイルの以前のバージョンと新しいバージョンの間の差分です。作業ツリーは、特定の時間における実際のコンテンツの単なるスナップショットです。とにかく、作業ツリーを使用すると、コミットとブランチの間を行き来できます。必要に応じて、別の作業ツリーでチェックアウトすることもできます。
user276648

246

ここに到着した後(同じ質問で)、何もない状態から完全に使用可能なリモート(ベア)リポジトリに移動するために必要なすべての手順を実際に説明する回答がないため、この回答を追加します。

注:この例では、ベアリポジトリの場所にローカルパスを使用していますが、他のgitプロトコル(OPで示されるSSHなど)は問題なく機能します。

gitにあまり慣れていない人のために、途中でいくつかのメモを追加しようとしました。

1.ベアリポジトリを初期化します...

> git init --bare /path/to/bare/repo.git
Initialised empty Git repository in /path/to/bare/repo.git/

これにより、フォルダー(repo.git)が作成され、そこにgit repoを表すgitファイルが追加されます。現状では、このレポは役に立たない-コミットがなく、さらに重要なことにブランチがない。このリポジトリを複製することはできますが、そこからプルすることはできません。

次に、作業フォルダを作成する必要があります。これを行うには、既存のファイルがあるかどうかによって、いくつかの方法があります。

2a。空のリポジトリを複製して、新しい作業フォルダ(既存のファイルなし)を作成します。

git clone /path/to/bare/repo.git /path/to/work
Cloning into '/path/to/work'...
warning: You appear to have cloned an empty repository.
done.

このコマンド/path/to/workは、存在しないか空のフォルダーである場合にのみ機能します。警告に注意してください-この段階では、まだ何も有用ではありません。あなたがcd /path/to/work実行するとgit status、次のようなものが得られます:

On branch master

Initial commit

nothing to commit (create/copy files and use "git add" to track)

しかし、これは嘘です。あなたは実際にはブランチにいませんmastergit branch何も返さないため)。これまでのところ、コミットはありません。

次に、作業フォルダーにいくつかのファイルをコピー/移動/作成し、それらをgitに追加して、最初のコミットを作成します。

> cd /path/to/work
> echo 123 > afile.txt
> git add .
> git config --local user.name adelphus
> git config --local user.email adelphus@example.com
> git commit -m "added afile"
[master (root-commit) 614ab02] added afile
 1 file changed, 1 insertion(+)
 create mode 100644 afile.txt

git configあなたはすでにあなたはgitのに語っていない場合、コマンドにのみ必要とされています。ここでを実行するgit branchと、masterブランチが一覧表示されます。今実行しますgit status

On branch master
Your branch is based on 'origin/master', but the upstream is gone.
  (use "git branch --unset-upstream" to fixup)

nothing to commit, working directory clean

これも誤解を招く可能性があります-アップストリームは「なくなった」わけではなく、まだ作成されていないだけで、git branch --unset-upstream役に立ちません。しかし、それで問題ありません。これで最初のコミットができたので、プッシュしてマスターをベアリポジトリに作成します。

> git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 207 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /path/to/bare/repo.git
 * [new branch]      master -> master

この時点で、完全に機能するベアリポジトリがあり、マスターブランチの他の場所にクローンを作成でき、プルおよびプッシュできるローカルの作業コピーも作成できます。

> git pull
Already up-to-date.
> git push origin master
Everything up-to-date

2b。既存のファイルから作業フォルダーを作成する すでにファイルが含まれているフォルダーがある場合(そのため、その中にクローンを作成できません)、新しいgitリポジトリを初期化し、最初のコミットを追加して、後でそれをベアリポジトリにリンクできます。

> cd /path/to/work_with_stuff
> git init 
Initialised empty Git repository in /path/to/work_with_stuff
> git add .
# add git config stuff if needed
> git commit -m "added stuff"

[master (root-commit) 614ab02] added stuff
 20 files changed, 1431 insertions(+)
 create mode 100644 stuff.txt
...

この時点で、最初のコミットとローカルマスターブランチがあり、リモートトラッキングされたアップストリームブランチに変換する必要があります。

> git remote add origin /path/to/bare/repo.git
> git push -u origin master
Counting objects: 31, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (31/31), done.
Writing objects: 100% (31/31), 43.23 KiB | 0 bytes/s, done.
Total 31 (delta 11), reused 0 (delta 0)
To /path/to/bare/repo.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.

-u(新しい)追跡された上流のブランチを設定するためのgit push のフラグに注意してください。以前と同様に、完全に機能するベアリポジトリがあり、マスターブランチの別の場所にクローンを作成でき、プルおよびプッシュできるローカルの作業コピーも作成できます。

これはすべて明白なように思えるかもしれませんが、gitは最良の状態で私を混乱させます(エラーメッセージとステータスメッセージは実際に多少の手直しが必要です)。


4
面白い。確かに私の答えよりも詳細です。+1
VonC 2015

13
この回答は私の問題を解決し、受け入れられる回答になるはずです。より多くの人が投票できることを願っています。
inix 2015

11
このような回答に対しては料金を請求する必要があります
Arthur Tarasov

2
新しいgitユーザーとして、この回答は私に非常に役立ちました。これを書いてくれてありがとう!
sidewinderguy

1
これは素晴らしい答えです。私たちのユニットに大いに役立ちます。
wobsoriano

33

質問に1つずつ答える:

ベアリポジトリは、作業ツリーないリポジトリです。それは、その内容全体が.gitディレクトリにあるものであることを意味します。

ローカルクローンからcommitリポジトリにアクセスすることによってのみ、ベアリポジトリにアクセスできpushます。作業ツリーがないため、ファイルの変更や変更はありません。

中央リポジトリを持つことは、それがbareリポジトリを持つことの唯一の方法です。


22

gitにディレクトリを作成するよう依頼することもできます。

git init --bare test_repo.git

20

一般的な方法は、ベアリポジトリとしてプッシュする中央リポジトリを用意することです。

SVNのバックグラウンドがある場合は、SVNリポジトリをGitベアリポジトリに関連付けることができます。元の形式のリポジトリ内のファイルはありません。一方、ローカルリポジトリには「コード」を構成するファイルが追加されます。

ローカルリポジトリからリモートをベアリポジトリに追加し、それに「コード」をプッシュする必要があります。

それは次のようなものになります:

git remote add central <url> # url will be ssh based for you
git push --all central

を使用するとgit remote add central <url>、SSHの場合、これにもパスが含まれますか?例git remote add central ssh://user@server/home/user/repo.git
はいバリー

17

これで十分です:

git remote add origin <url-of-bare-repo>
git push --all origin

詳細については、「GIT:ベアリポジトリを更新するにはどうすればよいですか?」を参照してください。
ノート:

  • originベアリポジトリのリモート参照には、「」以外の名前を使用できます。
  • これはタグをプッシュしませんgit push --tags origin。そのためには別のものが必要です。

5

プッシュしたコードが実際にコミットされたことを確認すると便利です。

--relativeオプションを使用してパスを明示的に設定することにより、ベアリポジトリの変更ログを取得できます。

$ cd test_repo
$ git log --relative=/

これにより、コミットされた変更が通常のgitリポジトリであるかのように表示されます。


5

Mark LongairとRoboprogの回答に基づいて:

gitバージョン> = 1.8の場合

git init --bare --shared=group .git
git config receive.denyCurrentBranch ignore

または:

gitバージョン<1.8の場合

mkdir .git
cd .git
git init --bare --shared=group 
git config receive.denyCurrentBranch ignore

そのconfigコマンド:作成した.gitディレクトリにどのように適用されるのですか?
GreenAsJade 2018

私はあなたの質問を理解しているかわかりませんか?もっと正確にできますか?あなたのgitリポジトリを初期化しているので、あなたは..あなたはコマンド「gitの設定」で必要な限り、それを構成することができます
ジャックの

@GreenAsJadeこれはまだgitリポジトリのフォルダー内にいるためです。そのため、これが適用されます(git configのデフォルトは--localオプションのようです)。
BlueCoder

2

--bareフラグは、作業ディレクトリがないリポジトリを作成します。ベアリポジトリは中央リポジトリであり、ここでマージエラーを回避するためにコードを編集(保存)することはできません。

たとえば、ローカルリポジトリ(マシン1)にファイルを追加し、それをベアリポジトリにプッシュすると、ベアリポジトリ内のファイルが常に「空」であることがわかりません。ただし、実際に何かをリポジトリにプッシュすると、サーバー(マシン2)に別のリポジトリを複製することで、それを暗黙のうちに確認できます。

マシン1のローカルレポジトリとマシン2の「コピー」レポジトリはどちらも非公開ではありません。 ベアリポジトリと非ベアリポジトリの関係

ブログはあなたがそれを理解するのに役立ちます。https://www.atlassian.com/git/tutorials/setting-up-a-repository


0

次のコマンドを実行して、ローカルリポジトリを初期化できます。

mkdir newProject
cd newProject
touch .gitignore
git init
git add .
git commit -m "Initial Commit"
git remote add origin user@host:~/path_on_server/newProject.git
git push origin master

ローカルリポジトリからプロジェクトを操作し、サーバーを中央リポジトリとして使用する必要があります。

Gitリポジトリーの作成と保守のあらゆる側面を説明するこの記事をフォローすることもできます。 初心者向けGit

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.