ベアリポジトリを更新するにはどうすればよいですか?


回答:


83

メインリポジトリからすべてのオブジェクトを複製する場合は、メインリポジトリ内で次のようにします。

git push --all <url-of-bare-repo>

または、ベアリポジトリ内でフェッチを実行します。

git fetch <url-of-main-repo>

プルはとマージしようとするため、プルを行うことはできませんHEAD。これは、ベアリポジトリにはないものです。

これらをリモートとして追加して、将来の入力を省くことができます。

git remote add <whatever-name> <url-of-other-repo>

その後、あなたは単に行うことができます

git push --all <whatever-name>

または

git fetch <whatever-name>

あなたがしている。Ifはレポ内容に応じ<whatever-name>ているorigin、あなたも完全にそれを残すことができます。

免責事項:私はGitの第一人者ではありません。私が何か間違ったことを言ったら、私は悟りを開きたいです!

更新:コメントを読んでください!


7
私が行ったときにgit-fetch --all裸のリポジトリ内で、私は私がメインのレポに作った更新情報が表示されませんでしたが、メインリポジトリからそれらをプッシュするときgit push --all <url-of-bare-repo>、私はで更新を確認しますgit log。おそらくこれには簡単な説明があります-誰かが説明できますか?
pho79 2012年

2
@トーマス-ええ、「見なかった」ということgit logで、これらの更新をベアリポジトリに表示しないことを意味します。(どちらも実行しません。またgit log --allgit log --allそこに表示されるはずの新しいファイルを介して、または単に表示することによって、裸のリポジトリを複製することによって作成された作業リポジトリも実行しません)。自分で確認するのはかなり簡単なテストです。ほとんどの場合、私は何が欠けているのか知りたいだけです。
pho79 2012年

71
最も遠いリポジトリがgithubのようなもので、アクセス権がない、プッシュを実行できないなどの場合git fetch -q origin master:master、ローカルのベアリポジトリ内で実行できます。これはgithubのマスターブランチから新しいものをフェッチし、ローカルマスターブランチをそれに更新します。
Altreus

4
@Altreus確かに、master:masterHEADをリモートリポジトリのリポジトリに移動するために必要なものです。私の場合、問題が発生したため、gitが見つからなかったため、ベアリポジトリに接続できなくなりました。それが解決されるまで、私はリバーストンネルを実行し、次を使用して中央のリポジトリにフェッチしgit fetch ssh://localhost:8765/... master:masterます。ありがとう!
エスタニ2013年

3
@Altreusすべてのブランチが必要な場合は、次のことができますgit fetch origin *:*
JBert

71

次のコマンドを使用してリポジトリを作成しました

git clone --bare <remote_repo>

次に、Thomasの回答を使用してベアクローンを更新しようとしましたが、うまくいきませんでした。ベアリポジトリを更新するには(これはLet_Me_Beが要求していたと私が思うことです)、ミラーリポジトリを作成する必要がありました。

git clone --mirror <remote_repo>

次に、ミラーリポジトリで次のコマンドを実行して、メインリポジトリの更新を取得します。

git fetch --all

私はプルしてミラーGitリポジトリを読んでこのソリューションに出会いました


22
既存のベアリポジトリをミラーに変更するには、<REPO> .git / configにあるgit構成ファイルに2行追加するだけです。では[remote "origin"]セクションの追加、fetch = +refs/*:refs/*およびmirror = true
アイザックBetesh

@IsaacBeteshあなたは私の日を救った:)
smc

54

で再作成する以外の唯一の解決策git clone --mirror、グレゴールからです:

git config remote.origin.fetch 'refs/heads/*:refs/heads/*'

その後git fetch、できますし、更新が表示されます。奇妙なことに、これより前に、remote設定されているにもかかわらず、にリストされてgit branch -aいるブランチがありません。


1
これは本当に私を助けました!Capistranoプロジェクト/リポジトリもこの設定を使用して、ワンライナーgit remote updateが作業を実行できるようにします。
Minqi Pan

1
リモートが強制的に更新または削除されたブランチを持っている(そしてそれらの変更を反映したい)場合は、--forceとを--pruneそれぞれgit fetchラインに追加する必要があるかもしれません。
Elliott Slaughter

46

仮定:

$ git clone --bare https://github.com/.../foo.git

フェッチ:

$ git --git-dir=foo.git fetch origin +refs/heads/*:refs/heads/* --prune

注:最初にディレクトリに移動--git-dir=foo.gitする場合は不要ですcd


2
いつ発生するかoriginはわかりませんが、が定義されていない場合は、いつでもorigin元のリポジトリへのパス/ URLでパーツを置き換えることができます。例$ git --git-dir=foo.git fetch https://github.com/.../foo.git +refs/heads/*:refs/heads/*
2016年

これはまさに私が探していたものです。これは完全に機能しました。
Maxime Rouiller

13

何度もいじった後、私はこれが私にとってうまくいくことを発見しました。

一度:

git clone --mirror ssh://git@source.address:2000/repo
git remote add remote_site ssh://git@remote_site.address/repo
git config remote.origin.fetch 'refs/heads/*:refs/heads/*'

同期したいときはいつでも:

cd /home/myhome/repo.git
git --bare fetch ssh://git@source.address:2000/repo
git  fetch ssh://git@source.address:2000/repo
git push --mirror remote_site

7
3行目(git config remote.origin.fetch 'refs/heads/*:refs/heads/*')はキーです。良い答え、ありがとう!
peterh-モニカを2017年

2
@peterhが言ったように、線git config remote.origin.fetch 'refs/heads/*:refs/heads/*'が答えです。このコマンドを打った後、私はちょうどできgit fetch、レポはリモートのものと同期します。
ジョーカー

3

ベアリポジトリをリモートリポジトリとして追加し、を使用しますgit push


だから私がプッシュせずにこれをしたいのであれば、裸のリポジトリを使用してシンボリックリンクなどを使用することはできませんか?
サイモン・トス

プッシュは、リポジトリのコンテンツをベアリポジトリに転送する通常の方法です。回避する必要はありません。
フィリップ

2
常に押すことはできません。たとえば、ベアがプライベートネットワークにあり、メインのリポジトリがパブリックなリポジトリである場合(例:GitHub上)
fanf42

0

私にとってこの組み合わせはうまくいきました:

git remote add remote_site https://github.com/project/repo.git
git fetch -u remote_site +refs/heads/:refs/heads/*
git push --mirror

フェッチには-uパラメータが必要でした。それ以外の場合は、「現在のブランチrefs / heads / masterの非ベアリポジトリへのフェッチを拒否しています」というエラーメッセージが表示されます(https://stackoverflow.com/a/19205680/4807875参照

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