web-dev-qa-db-ja.com

ローカルのGitリポジトリからリモートのGitリポジトリを作成するにはどうすればいいですか?

私はローカルのGitリポジトリを持っています。リモートのSSH対応のサーバーで利用できるようにしたいです。どうやってこれをするの?

202
Nips

私はあなたがリモートサイド裸のリポジトリgit init --bareを作成すると思います、あなたのローカルリポジトリ(git remote add Origin URL)のためのプッシュ/プルトラッカーとしてリモートサイドを追加し、そしてローカルにあなただけのgit Push Origin masterを言います。これで、他のリポジトリはリモートリポジトリからpullを取得できます。

248
Kerrek SB

Gitサーバーを最初に設定するには、既存のリポジトリを新しいベアリポジトリ(作業ディレクトリを含まないリポジトリ)にエクスポートする必要があります。これは一般的に簡単です。リポジトリを複製して新しいベアリポジトリを作成するには、cloneコマンドに--bareオプションを付けて実行します。慣例により、裸のリポジトリディレクトリは.gitで終わります。

$ git clone --bare my_project my_project.git
Initialized empty Git repository in /opt/projects/my_project.git/

このコマンドは、作業ディレクトリを使わずにGitリポジトリを自分自身で取得し、それ専用のディレクトリを作成します。

あなたは自分のリポジトリの裸のコピーを持っているので、あなたがする必要があるのはサーバにそれを置き、あなたのプロトコルを設定することだけです。 SSHアクセスが可能なgit.example.comというサーバーを設定し、すべてのGitリポジトリを/opt/gitディレクトリの下に保存するとします。ベアリポジトリをコピーして新しいリポジトリを設定できます。

$ scp -r my_project.git [email protected]:/opt/git

この時点で、/opt/gitディレクトリへの読み取りアクセス権を持つ同じサーバーへのSSHアクセス権を持つ他のユーザーは、次のコマンドを実行してリポジトリを複製できます。

$ git clone [email protected]:/opt/git/my_project.git

ユーザーがサーバーにSSH接続して/opt/git/my_project.gitディレクトリへの書き込みアクセス権を持っている場合は、自動的にプッシュアクセス権も与えられます。 --sharedオプションを指定してgit initコマンドを実行すると、Gitは自動的にグループ書き込み権限をリポジトリに適切に追加します。

$ ssh [email protected]
$ cd /opt/git/my_project.git
$ git init --bare --shared

Gitリポジトリを入手してベアバージョンを作成し、それをあなたとあなたの共同編集者がSSHアクセスできるサーバーに置くのは非常に簡単です。これで、同じプロジェクトで共同作業する準備が整いました。

66
Binoy Babu

Windows上でローカルコピーを作成し、Unix系システム上で対応するリモートリポジトリを作成したいという人々のためのメモです。テキストファイルは、Unixライクシステム上の開発者によってさらにクローンの末尾がLFになりますWindowsでは。

行末変換を設定する前に Windowsリポジトリを作成した場合 、問題があります。 Gitのデフォルト設定は翻訳なしなので、あなたのワーキングセットはCRLFを使用しますが、あなたのリポジトリ(すなわち.gitの下に保存されたデータ)はファイルもCRLFとして保存しています。

リモートにプッシュすると、保存されたファイルはそのままコピーされ、行末変換は行われません。 (行末変換は、ファイルがリポジトリにコミットされたときに行われ、リポジトリがプッシュされたときには行われません)。あなたはあなたのUnix風のリポジトリでCRLFになってしまいますが、これはあなたが望むことではありません。

リモートリポジトリでLFを取得するには、最初にLFがローカルリポジトリにあることを確認する必要があります。それには、 Windowsリポジトリを再正規化します 。これはCRLFの末尾を持つWindowsワーキングセットには目に見える影響を与えませんが、リモートにプッシュすると、リモートはLFを正しく取得します。

Windowsリポジトリにある行末を簡単に判断できる方法があるかどうかわかりません - core.autocrlf = falseに設定してからクローン作成することでテストできると思います(リポジトリにLFがある場合クローンにはLFもあります)。

8
user1804620

リモートリポジトリは通常ベアリポジトリです - 作業ディレクトリがないGitリポジトリです。リポジトリはコラボレーションポイントとしてのみ使用されるため、スナップショットをディスク上でチェックアウトする必要はありません。それはGitデータだけです。最も簡単に言うと、裸のリポジトリはプロジェクトの.gitディレクトリの内容であり、それ以外にはありません。

次のコードでベアgitリポジトリを作ることができます。

$ git clone --bare /path/to/project project.git

リモートのgitリポジトリを持つための一つの選択肢はSSHプロトコルを使うことです:

セルフホスティングがSSHを介している場合のGitの一般的な転送プロトコル。これは、サーバーへのSSHアクセスがほとんどの場所ですでに設定されているためです。そうでない場合は、簡単に行うことができます。 SSHは認証されたネットワークプロトコルでもあります、そしてそれはどこにでもあるので、一般的にセットアップして使用するのが簡単です。

SSH経由でGitリポジトリを複製するには、次のようにssh://というURLを指定します。

$ git clone ssh://[user@]server/project.git

あるいはSSHプロトコルにはもっと短いscp風の構文を使うことができます。

$ git clone [user@]server:project.git

上記のどちらの場合でも、オプションのユーザー名を指定しないと、Gitは現在ログインしているユーザーと見なします。

長所

SSHを使用する利点はたくさんあります。まず、SSHは比較的設定が簡単です - SSHデーモンはごく普通のもので、多くのネットワーク管理者が経験を積んでおり、多くのOSディストリビューションがそれらを使って設定したり、それらを管理するツールを持っています。次に、SSH経由のアクセスは安全です。すべてのデータ転送は暗号化され、認証されています。最後に、HTTPS、Git、およびLocalプロトコルのように、SSHは効率的であり、データを転送する前にできるだけコンパクトにします。

短所

SSHのマイナス面は、Gitリポジトリへの匿名アクセスをサポートしていないことです。 SSHを使用している場合は、読み取り専用の容量であっても、ユーザーは自分のマシンにSSHでアクセスできる必要があります。そのため、SSHでリポジトリを複製して調べることはできません。社内ネットワーク内でのみ使用している場合は、SSHが唯一の対処が必要なプロトコルです。プロジェクトへの匿名の読み取り専用アクセスを許可し、SSHも使用する場合は、プッシュオーバー用にSSHを設定する必要がありますが、他のユーザーが取得するためには別のものを設定する必要があります。

詳しくは、次の資料を参照してください。 サーバーのGit - プロトコル

2
Amirhossein72

リモートサーバーにディレクトリを作成する必要があります。それから "git init"コマンドを使ってリポジトリとして設定します。これはあなたが持っているそれぞれの新しいプロジェクト(それぞれの新しいフォルダー)に対して行われるべきです。

すでにsshキーを使ってgitを設定して使用していると仮定して、私は小さなPythonスクリプトを書きました。もちろん、スクリプトを編集して(一度だけ)、すべてのリポジトリのサーバーとルートパスを指定する必要があります。

ここでチェックしてください - https://github.com/skbobade/ocgi

2
Sam

上記の2つの一般的なソリューションには興味深い違いがあります。

  1. このようなベアリポジトリを作成する場合:

     cd /outside_of_any_repo
    mkdir my_remote.git 
     cd my_remote.git 
     git init --bare 
    

その後

cd  /your_path/original_repo
git remote add Origin /outside_of_any_repo/my_remote.git
git Push --set-upstream Origin master

次に、gitはこの関係を使用して 'original_repo'の構成をセットアップします。

original_repo Origin --> /outside_of_any_repo/my_remote.git/

後者をアップストリームリモートとして使用します。また、アップストリームリモートの構成には、他のリモートはありません。

  1. ただし、逆に行う場合:

    (ディレクトリoriginal_repoから)
     cd .. 
     git clone --bare original_repo /outside_of_any_repo/my_remote.git
    

次に、「my_remote.git」は、「Origin」がリモートとして「original_repo」を指すように設定され、remote.Origin.urlがローカルディレクトリパスに等しいため、移動する場合は適切ではない可能性がありますサーバーへ。

適切ではない場合、その「リモート」参照は後で簡単に削除できますが、「original_repo」は、「my_remote.git」を上流のリモートとして(またはどこに向かっても)設定する必要がありますから共有されます)。技術的には、アプローチ2でさらにいくつかの手順を実行すると、同じ結果に到達できます。ただし、#1は、より少ない手順で、サーバーに移動するのに適した、ローカルのリポジトリから始まる「中央のベア共有リポジトリ」を作成するためのより直接的なアプローチのようです。リモートリポジトリが果たす役割に依存すると思います。 (そして、はい、これはドキュメントと矛盾しています ここ 。)

注意:ローカルシステムで実際のレポを使用してテストを実行し、結果をファイルごとに比較することで、上記を(2019年8月初旬の執筆時点で)学びました。しかし!私はまだ学んでいるので、もっと正しい方法があるかもしれません。しかし、私のテストは、#1が私の現在好ましい方法であると結論付けるのに役立ちました。

2
V. Wheeler