Mercurialで通常行うように、特定のリビジョンでgitリポジトリのクローンを作成するにはどうすればよいですか?
hg clone -r 3 /path/to/repository
$ git clone $URL
$ cd $PROJECT_NAME
$ git reset --hard $SHA1
再び最新のコミットに戻るには
$ git pull
戻されたコミットをオンライン(リモート)で保存するには、強制オリジンをプッシュする必要があります。
git push origin -f
UPDATE 2 Git 2.5.0以降、以下で説明する機能は構成変数を使用してサーバー側で有効にできますuploadpack.allowReachableSHA1InWant
。ここでは、GitHub機能リクエストとGitHubコミットでこの機能を有効にします。一部のGitサーバーはデフォルトでこのオプションをアクティブにすることに注意してください。たとえば、BitbucketServerはバージョン5.5以降でこのオプションを有効にしました。構成オプションをアクティブ化する方法の例については、Stackexchangeでこの回答を参照してください。
UPDATE 1 Gitバージョンの場合、 Vaibhav Bajpaiの回答1.7 < v < 2.5
で説明されているように、gitcloneとgitresetを使用します
リポジトリ全体をフェッチしたくない場合は、おそらくを使用しないでくださいclone
。いつでもフェッチを使用して、フェッチするブランチを選択できます。私はhgの専門家ではないので、詳細はわかりません-r
が、gitではこのようなことができます。
# make a new blank repository in the current directory
git init
# add a remote
git remote add origin url://to/source/repository
# fetch a commit (or branch or tag) of interest
# Note: the full history up to this commit will be retrieved unless
# you limit it with '--depth=...' or '--shallow-since=...'
git fetch origin <sha1-of-commit-of-interest>
# reset this repository's master branch to the commit of interest
git reset --hard FETCH_HEAD
特定のブランチまたはタグで単一の特定のコミットのみを複製するには、次のように使用します。
git clone --depth=1 --branch NAME https://github.com/your/repo.git
残念ながら、NAME
ブランチ名またはタグ名のみにすることができます(SHAをコミットすることはできません)。
フラグを省略して--depth
履歴全体をダウンロードしてから、そのブランチまたはタグをチェックアウトします。
git clone --branch NAME https://github.com/your/repo.git
これは最近のバージョンのgitで動作します(私はバージョンでそれを行いました2.18.0
)。
gitリポジトリのクローンを作成すると、適切にリポジトリ全体のクローンが作成されます。クローンを作成するリビジョンを1つだけ選択する方法はありません。ただし、を実行するgit clone
と、を実行して特定のリビジョンをチェックアウトできますcheckout <rev>
。
最初から特定のポイントまですべてを取得したい場合は、CharlesBaileyの答えが最適です。逆の操作を行い、現在の日付からさかのぼって履歴のサブセットを取得する場合は、次を使用できますgit clone --depth [N]
。ここで、Nは必要な履歴の回転数です。でも:
- 深さ
指定されたリビジョン数に切り捨てられた履歴を持つシャロークローンを作成します。浅いリポジトリにはいくつかの制限があります(クローンやフェッチ、プッシュやプッシュはできません)が、長い歴史を持つ大規模なプロジェクトの最近の履歴にのみ関心があり、修正をパッチとして送信します。
簡単に使用できますgit checkout <commit hash>
この順序で
bash
git clone [URLTORepository]
git checkout [commithash]
コミットハッシュは次のようになります「45ef55ac20ce2389c9180658fdba35f4a663d204」
要約すると(git v。1.7.2.1):
git clone
に実行します(すべてを最新の状態にします—必要なものではなく、私たちはそこに到達しています) git checkout <sha1 rev>
あなたが望む回転のgit reset --hard
git checkout -b master
TL; DR-クローンを作成するコミットに対してソースリポジトリにタグを作成し、そのタグをフェッチコマンドで使用するだけです。後で元のリポジトリからタグを削除してクリーンアップできます。
ええと、その2014年と2010年からのチャールズベイリーの受け入れられた答えは今では本当に時代遅れであるように見えます、そして他の答えのほとんど(すべて?)はクローンを含みます、それは多くの人々が避けたいと望んでいます。
次のソリューションは、OPや他の多くの人が探しているものを実現します。これは、履歴を含むリポジトリのコピーを作成する方法ですが、特定のコミットまでしか作成できません。
ローカルリポジトリ(つまり、別のディレクトリのリポジトリ)を特定のポイントまで複製するためにgitバージョン2.1.2で使用したコマンドは次のとおりです。
# in the source repository, create a tag against the commit you want to check out
git tag -m "Temporary tag" tmptag <sha1>
# create a new directory and change into that directory
cd somewhere_else;mkdir newdir;cd newdir
# ...and create a new repository
git init
# add the source repository as a remote (this can be a URL or a directory)
git remote add origin /path/to/original/repo
# fetch the tag, which will include the entire repo and history up to that point
git fetch origin refs/tags/tmptag
# reset the head of the repository
git reset --hard FETCH_HEAD
# you can now change back to the original repository and remove the temporary tag
cd original_repo
git tag -d tmptag
うまくいけば、このソリューションはさらに数年間機能し続けます!:-)
上記の回答の2つを使用する(特定のリビジョン/チェンジセットでgitリポジトリを複製する方法?および特定のリビジョン/チェンジセットでgitリポジトリを複製する方法?)決定的なものを思い付くのに役立ちました。ポイントまでクローンを作成する場合は、そのポイントは単なるSHAではなくタグ/ブランチである必要があります。そうしないと、FETCH_HEADが混乱します。git fetchセットに続いて、ブランチ名またはタグ名を使用すると応答が返されますが、SHA-1を使用するだけでは応答がありません。
これが私がしたことです:-実際のオリジンから、完全なリポジトリの完全に機能するクローンを作成します
cd <path to create repo>
git clone git@<our gitlab server>:ui-developers/ui.git
次に、興味深いポイントでローカルブランチを作成します
git checkout 2050c8829c67f04b0db81e6247bb589c950afb14
git checkout -b origin_point
次に、ローカルコピーを元として、新しい空白のリポジトリを作成します
cd <path to create repo>
mkdir reduced-repo
cd reduced-repo
git init
git remote add local_copy <path to create repo>/ui
git fetch local_copy origin_point
その時点で私はこの応答を得ました。上記のブランチの代わりにSHA-1を使用しても何も起こらないので、応答は機能したことを意味します。
/ var / www / html / ui-hacking $ git fetch local_copy origin_point リモート:オブジェクトのカウント:45493、完了。 リモート:オブジェクトの圧縮:100%(15928/15928)、完了。 リモート:合計45493(デルタ27508)、再利用45387(デルタ27463) オブジェクトの受信:100%(45493/45493)、53.64 MiB | 50.59 MiB / s、完了。 デルタの解決:100%(27508/27508)、完了。 / var / www / html/uiから *ブランチorigin_point->FETCH_HEAD *[新しいブランチ]origin_point->origin / origin_point
私の場合は、それを新しいリポジトリとしてgitlabに戻す必要があったので、
git remote add origin git@<our gitlab server>:ui-developers/new-ui.git
git --git-dir=../ui/.git format-patch -k -1 --stdout <sha1> | git am -3 -k
つまり、リモートでチェリーピックを使用して、origin_pointからリポジトリを再構築し、それを使用git push origin
してロット全体を新しいホームにアップロードすることができます。
それが誰かを助けることを願っています
私のバージョンは、受け入れられた回答と最も賛成された回答の組み合わせでした。しかし、それは少し異なります。なぜなら、誰もがSHA1を使用しているのに、誰もそれを取得する方法を教えてくれないからです。
$ git init
$ git remote add <remote_url>
$ git fetch --all
今、あなたはすべてのブランチとコミットを見ることができます
$ git branch -a
$ git log remotes/origin/master <-- or any other branch
最後に、目的のコミットのSHA1を知っています
git reset --hard <sha1>
# clone special tag/branch without history
git clone --branch=<tag/branch> --depth=1 <repository>
# clone special revision with minimal histories
git clone --branch <branch> <repository> --shallow-since=yyyy-MM-ddTHH:mm:ss # get the commit time
cd <dir>
git reset --hard <revision>
サーバー側で設定されていない場合、履歴なしでリビジョンを取得することはできませんが、uploadpack.allowReachableSHA1InWant=true
そのタグを作成して、代わりに特別なタグのクローンを作成することができます。
このスニペットをGNUmakeで使用して、リビジョンタグ、ブランチ、またはハッシュを閉じます
gitバージョン2.17.1でテストされました
${dir}:
mkdir -p ${@D}
git clone --recursive --depth 1 --branch ${revison} ${url} ${@} \
|| git clone --recursive --branch ${revison} ${url} ${@} \
|| git clone ${url} ${@}
cd ${@} && git reset --hard ${revison}
ls $@
私はこの答えから学んだgitclone--configオプションを使用してこれを達成することができました: https ://stackoverflow.com/a/43759576/1330650
私のシナリオには、Azure DevOpsパイプラインでのスパースチェックアウトが含まれます。この場合、ブランチ名ではなく、コミットハッシュを使用してリポジトリのクローンを作成する必要があります。cloneコマンドは、パラメーターとしてコミットハッシュを受け入れません。回避策は、refspecを含む構成変数(-c)を設定することです。これは、refspecがブランチ名の代わりにコミットハッシュを使用できるためです。
git clone -c remote.origin.fetch=+<commit hash>:refs/remotes/origin/<commit hash> <repo_url> --no-checkout --progress --depth 1
git sparse-checkout init --cone
git sparse-checkout set <file list>
git checkout <commit hash>
個人的には、単一のコミットを複製する私のお気に入りの方法です。
mkdir repo && cd repo && git init
git remote add origin <url>
git fetch --depth 1 --no-tags --no-write-fetch-head origin tag <tag>
git branch master <tag>
git checkout
ヘッドが切り離された状態を回避するために、デフォルトのブランチ(この場合はマスター)がタグ/コミットを指すように設定します。
私の意見では、このメソッドの優れている点は、実際には1つのタグのみをフェッチすることです。tag <tag>
また、構文によってタグがrefs / tags / *の下にローカルに保存されるため、役に立たないFETCH_HEADを作成することも避けます。これにより、--no-tags
gitは同じコミットを指す可能性のある他のタグをダウンロードできなくなります。
--no-tags tag <tag>
構文の代替は次のようになります
git config --add remote.origin.fetch 'refs/tags/*:refs/tags/*'
これで、フェッチ操作は次のようになります。
git fetch --depth 1 --no-write-fetch-head origin <tag>
リストされている他のメソッドは、私の経験では、単一のコミットと、その特定のコミットに関連付けられているすべてのタグをダウンロードします。例として、Googleソースリポジトリのいずれかをチェックアウトすると、git clone -b <tag> --depth 1 <url>
すべて同じコミットにリンクされた一連のタグが表示されます。これはほとんどの場合問題ではありませんがgit log
、コミットに10〜15個のタグが関連付けられていると非常に醜いものになります。また、どのタグに興味があるかはサードパーティにはまったくわかりません。これを複製して別のプロジェクトにサブモジュールとして追加するとします...ユーザーは、タグxが存在する場合に興味があることを知ることができません。タグsからz。最終的に、タグはすべて同じコミットを指すため、問題ではありませんが、単一のタグを持つ方がはるかに明確です。
単一ファイルの場合、コミット番号がわかっている場合は、wgetonlinerを使用できます。
wget https://raw.githubusercontent.com/torvalds/linux/896066ee1cf4d653057dac4e952f49c96ad16fa7/README
git clone https://github.com/ORGANIZATION/repository.git
(リポジトリのクローンを作成します)
cd repository (navigate to the repository)
git fetch origin 2600f4f928773d79164964137d514b85400b09b2
git checkout FETCH_HEAD
git clone -o <sha1-of-the-commit> <repository-url> <local-dir-name>
git
origin
一般的に知られている代わりに単語を使用しますrevision
以下はマニュアルの抜粋です$ git help clone
--origin <name>, -o <name>
Instead of using the remote name origin to keep track of the upstream repository, use <name>.