リモートリポジトリから特定のリビジョンを取得するgit


56

リモートgitリポジトリがあり、通常はgit push開発サーバーで使用git pullし、ライブサーバーで使用して、最新のプッシュバージョンのリポジトリを取得します。

しかし、いくつかのリビジョンをコミットしてプッシュした場合(git pullライブサーバー上にない場合)git pull、必要な古いコミットを参照することはできますか?

すなわちのようなもの git pull -r 3ef0dedda699f56dc1062b5dcc2c59f7ad93ede4

回答:


64

リポジトリを取得したら、次の操作を実行できるはずです。

git checkout 3ef0d...

1
いいですね、これは完璧に機能しました。また、将来のプルのために同期を取り戻したい場合は、次のプルを実行するときにリモートサーバーを指定する必要があります(つまりgit pull server:repo、通常とgit pull
比較

1
OPが間違った質問をしたかもしれませんが、私にとっては正しい質問であり、これは答えではありません。サーバーに特定のコミットがありますが、ローカルにありません。コミットはブランチの一部でもタグの一部でもなく、プル/フェッチで転送されません。特定のコミットを取得する方法は?
BlackEye

8

uploadpack.allowReachableSHA1InWant

Git 2.5.0以降、この構成変数はサーバー上で有効にできるため、ここではGitHub機能のリクエストGitHubがこの機能を有効にします

Bitbucket Serverは、バージョン5.5以降で有効にしました

使用法:

# Make remote with 4 commits, and local with just one.
mkdir server
cd server
git init
touch 1
git add 1
git commit -m 1
git clone ./ ../local
for i in {2..4}; do
    touch "$i"
    git add "$i"
    git commit -m "$i"
done

# Before last commit.
SHA3="$(git log --format='%H' --skip=1 -n1)"
# Last commit.
SHA4="$(git log --format='%H' -n1)"

# Failing control without feature.
cd ../local
# Does not give an error, but does not fetch either.
git fetch origin "$SHA3"
# Error.
git checkout "$SHA3"

# Enable the feature.
cd ../server
git config uploadpack.allowReachableSHA1InWant true

# Now it works.
cd ../local
git fetch origin "$SHA3"
git checkout "$SHA3"
# Error.
git checkout "$SHA4"

2

ライブサーバー上のプロセスがすぐにプルされたコンテンツにすぐにアクセスする場合(つまりgit checkout 3ef0d、プル後に操作できない場合)、プロダクションにデプロイするバージョンにタグを付け、特にプロダクションでそのタグをチェックアウトすることを検討する必要があります作業ディレクトリを変更します。そうしないと、プルの直前に誰かがプッシュする危険があります。


1

これにより、git pull git checkout my-old-commit 現在はDETACHED HEAD状態のままになっていることに注意して ください。事実上、このリポジトリ内の将来のコミットを新しいコミットパスに送信していることになります。デプロイメントリポジトリの場合、これは重大な問題ではありません。コミットされるのはプルされる前にすでに正しくコミットされているコミットのみである必要があるためです。

ただし、コミットマーカー(ヘッド、タグ、リモート)がマスターリポジトリと同一に見えることを確認すると便利な場合があります。チェックアウト後にこれを修正するには:git reset -ヘッドを再接続し ます git fetch -リモートのマーカーを同期します[これはgitバージョンに依存する可能性があります-確かに環境はまだ1.7 ...ですので、YMMVは不要になるかもしれません]

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