web-dev-qa-db-ja.com

リモートリポジトリから特定のリビジョンをgit fetch

私たちは、通常devサーバーでgit Pushを使用し、次にライブサーバーでgit pullを使用してデプロイするリモートgitリポジトリを使用して、最新のプッシュバージョンのリポジトリを取得します。

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

つまり、git pull -r 3ef0dedda699f56dc1062b5dcc2c59f7ad93ede4のようなもの

57
dlrust

リポジトリをプルしたら、次の手順に進むことができます。

git checkout 3ef0d...
68
Scott Muc

uploadpack.allowReachableSHA1InWant

Git 2.5. この構成変数はサーバーで有効にできるため、ここでは 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"

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

2
Olaf

git pull git checkout my-old-commitがDETACHED HEAD=状態になりました-事実上、このリポジトリの新しいコミットパスで将来のコミットを送信しています。デプロイメントリポジトリの場合、これは大きな問題ではありません。コミットは、プルされる前にすでに正しくコミットされているものでなければなりません。

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

1
simon coleman