どのようにしてgitリポジトリを特定のリビジョンでクローンすることができますか?これは私が普段Mercurialで行っているようなものです:
hg clone -r 3 /path/to/repository
UPDATE 2 Git 2.5.0 以降、以下の機能は設定変数uploadpack.allowReachableSHA1InWant
を使ってサーバー側で有効にできます。ここでは GitHub機能要求 と この機能を有効にするGitHubコミット 。 Gitサーバーの中にはデフォルトでこのオプションを有効にするものがあります。 Bitbucket Serverは version 5.5+ 以降有効にしました。設定オプションを有効にする方法の例については、 Stackexchangeに対する回答 を参照してください。
UPDATE 1 Gitバージョンの場合1.7 < v < 2.5
は Vaibhav Bajpai's answer に記述されているようにgit cloneとgit resetを使います。
完全なリポジトリを取得したくない場合は、おそらく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 $URL
$ cd $PROJECT_NAME
$ git reset --hard $SHA1
最新のコミットに戻る
$ git pull
Gitリポジトリをクローンすると、リポジトリ全体がクローンされます。クローンを作成するリビジョンを1つだけ選択する方法はありません。ただし、git clone
を実行すると、checkout <rev>
を実行して特定のリビジョンをチェックアウトできます。
最初から特定の時点までのすべてを取得したいという場合は、Charles Baileyの答えが完璧です。逆の操作をして現在の日付からさかのぼって履歴のサブセットを取得したい場合は、git clone --depth [N]
を使用できます。ここでNは必要な履歴の回転数です。しかしながら:
--depth
指定したリビジョン数まで切り捨てられた履歴を持つ、シャロークローンを作成します。浅いリポジトリにはいくつかの制限があります(クローンを作成したりそこから取得したり、そこからプッシュしたりすることはできません)が、長いプロジェクトの最近の履歴のみに興味がある場合は十分です。パッチとして修正を送ってください。
まとめると(git v。1.7.2.1):
git clone
をしてください。git checkout <sha1 rev>
git reset --hard
git checkout -b master
TL; DR - クローンしたいコミットに対してソースリポジトリにタグを作成し、そのタグをfetchコマンドで使用するだけです。後で元のリポジトリからタグを削除してクリーンアップすることができます。
2014年のCharles Baileyの答えは今では古くなっており、他の答えのほとんど(すべて)はクローン作成に関係しています。
以下の解決策は、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
うまくいけば、このソリューションはさらに数年間働き続けます! :-)
あなたは単にgit checkout <commit hash>
を使うことができます
この順序で
bash git clone [URLTORepository] git checkout [commithash]
ハッシュのコミットは次のようになります。 "45ef55ac20ce2389c9180658fdba35f4a663d204"
特定のブランチやタグで/ - 単一の特定のコミットのみ をクローンするには:
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 clone https://github.com/ORGANIZATION/repository.git
(リポジトリをクローンする)
cd repository (navigate to the repository)
git fetch Origin 2600f4f928773d79164964137d514b85400b09b2
git checkout FETCH_HEAD
上記の答えのうち2つを使って( 特定のリビジョン/チェンジセットを使ってgitリポジトリをクローンする方法? および 特定のリビジョン/チェンジセットを使ってgitリポジトリをクローンする方法? )私は決定的な結論を出しました。ポイントまでクローンしたい場合は、そのポイントは単にSHAではなくタグ/ブランチである必要があります。そうしないと、FETCH_HEADが混乱します。 gitフェッチセットに続いて、ブランチ名やタグ名を使用した場合はレスポンスが返されます。単にSHA-1を使用した場合はレスポンスが返されません。
これが私がしたことです: - 実際のOriginから、フルリポジトリの完全に機能するクローンを作成します。
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原点 remote:個数を数えるオブジェクト:45493、done remote:数を圧縮するオブジェクト: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
を使ってリモートからチェリーピックして、git Push Origin
を使って新しい家に全部アップロードすることで、Origin_pointからリポジトリを再構築することができました。
誰かに役立つことを願っています
私のバージョンは、広く認められた回答と最も支持された回答を組み合わせたものです。誰もが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>
このスニペットをGNU makeで使用して、リビジョンタグ、ブランチ、またはハッシュを閉じます
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 $@
それは簡単です。現在のブランチにアップストリームを設定するだけです
$ git clone repo
$ git checkout -b newbranch
$ git branch --set-upstream-to=Origin/branch newbranch
$ git pull
それで全部です