56

リモートリポジトリの最新のミラーを取得するための1つのコマンドの方法はありますか?あれは

  • ローカルリポジトリがまだない場合:クローン
  • そこにある場合:プル

これをスクリプト化できることはわかっていますが(たとえばif [ -d repo ]; then (cd repo && git pull); else git clone $repourl;fi )、可能な限り単純なクロスプラットフォームの方法が必要です(実際にはJenkins-CIで使用され、デフォルトでこれを実行しますが、サポートが制限されている2つのリポジトリが必要です)。

Gitには他のもの(たとえば、checkout -b、およびそれ自体をプルする)への同様のショートカットがあるので、何かを逃したのではないかと思います。ありがとう!

4

7 に答える 7

84

既存のリポジトリを操作するコマンドはすべて、特定のリポジトリ内で実行されていると想定しているため、ありません。

とはいえ、シェルで実行している場合は、組み込みのシェルを使用するだけで済みます。たとえば、bashは次のとおりです。

if cd repo; then git pull; else git clone https://server/repo repo; fi

repoこれは、が有効なディレクトリであるかどうかを確認し、有効な場合はそのディレクトリpull内で実行します。それ以外の場合はclone、ディレクトリを作成します。

于 2013-03-24T18:09:15.987 に答える
58

最もきれいなワンライナーは

git -C repo pull || git clone https://server/repo repo
于 2015-07-02T13:53:16.123 に答える
3

git -C repo pullgit1.8.5以降でのみ動作します。以前のバージョンでこれを実現するには、次のことを試してください。

remote_repo=https://server/repo
local_repo=repo

if [ -d $local_repo/.git ]; then pushd $local_repo; git pull; popd; else git clone $remote_repo; fi
于 2018-03-08T14:03:51.970 に答える
3

gitのアップグレードがオプションではなく、リポジトリの引数を渡したくない場合、スクリプトによるアプローチは次のようになります。

#!/bin/bash

function clone_pull {
  DIRECTORY=$(basename "$1" .git)
  if [ -d "$DIRECTORY" ]; then
    cd "$DIRECTORY"
    git pull
    cd ../
  else
    git clone "$1"
  fi
}

clone_pull https://github.com/<namespace>/<repo>
# or
clone_pull git@github.com:<namespace>/<repo>.git
于 2018-08-17T19:47:17.473 に答える
0

git pullローカルリポジトリのローカル構成にリモートが登録されているため、クローンを作成する場所を認識しています。作業ツリーから動作します。

ただしgit clone、そうではありません。クローンを作成するには、明示的なリモートURLをパラメーターで渡す必要があります。作業ツリーの外部で動作します。

このようなショートカットが存在しない主な理由は次のとおりです。

  • 特定のレポに対してはめったにありませんgit init。これは、レポの存続期間中の1回限りのコマンドです。さらに、完了するには追加
    のコマンド が必要になる場合があります。たとえば、サブモジュールがある場合は、を追加する必要があります。git submodule update --init
  • 多くの場合git pull、特定のリポジトリ内にいます。git pullはそれ自体がショートカットです(git fetch+の場合git merge)。+のもうgit pull --rebase1つのショートカットです。git fetchgit rebase

使用する回数を考えるとgit init、このようなショートカットは優先度が高くありません。

したがって、スクリプトは、必要なものを定義するための最も確実な方法です。

于 2013-03-24T18:09:10.907 に答える
0

Jenkinsについて言及したので、 JenkinsSCMAPIを使用してクローンまたはプルすることができます。このcheckoutメソッドは、あなたが望むことを正確に実行します。

次のようなGroovyスクリプトから実行できます。

dir (targetFolder) {
  checkout(scm: [$class: 'GitSCM', branches: [[name: 'master']], ...])
}

gitの意味で指定されたブランチをチェックアウトするのではなく、対応するコミットでワークスペースを切り離されたヘッドに残すことに注意してください。

于 2019-03-26T20:01:42.617 に答える
0

これがもう1つの1ライナーです。ここでの他の解決策とは対照的に、このコードはターミナルでエラーを出力しません。

(test -d my-repo && git -C my-repo pull --rebase) || \
  git clone https://github.com/my-repo my-repo

これは、リポジトリとソースURLが変数であるバリエーションであるため、リポジトリフォルダーを3回繰り返す必要はありません。

DIR=my-repo && ORIGIN=https://github.com/my-repo/ && \
  (test -d $DIR && git -C $DIR pull --rebase) || git clone $ORIGIN $DIR
于 2021-10-15T22:12:31.473 に答える