リモートのタグを使用して、ローカルgitタグをロックステップに保持する方法はありますか?つまり、作成時に新しいタグを取得するだけでなく(通常、fetch
- ing/pull
- ingするとき)、リモートでプルーニングタグを削除し、既存のタグを削除するときにも他の誰かgit Push -f
はタグです。自分ができるということがわかっている git fetch remotename
に続く git remote Prune remotename
ブランチに対して同様の動作を実現します。
...また、リモートにプルーニングタグがなくなりました
git fetch
は、Git 2.17(2018年第2四半期)で、ローカルに保持されている古いタグを取り除くための便利な速記を取得します。
commit 6317972 、 commit 97716d2 、 commit e249ce 、 commit 627a129 、 commit d0e0747 を参照してください、 コミット2c72ed7 、 コミットe1790f9 、 コミット59caf52 、 コミット82f34e 、 コミット6fb23f5 、 コミットca3065e 、 コミットbf16ab7 、 コミットeca142d 、 コミット750d0da 、 コミット071188 、 commit ce3ab21 、 commit aa59e0e (2018年2月9日)by ÆvarArnfjörðBjarmason(avar
) .
( C浜野順夫-gitster
- in commit c1a7902 、2018年3月6日)
fetch:
--Prune-tags
オプションとfetch.pruneTags
configを追加します
--Prune-tags
configオプションおよびgit-fetch
省略形(fetch.pruneTags
は-P
)とともに、-p
オプションを--Prune
に追加します。
これにより、次のいずれかを実行できます。git fetch -p -P git fetch --Prune --Prune-tags git fetch -p -P Origin git fetch --Prune --Prune-tags Origin
または単に:
git config fetch.Prune true && git config fetch.pruneTags true && git fetch
より冗長な代わりに:
git fetch --Prune Origin 'refs/tags/*:refs/tags/*' '+refs/heads/*:refs/remotes/Origin/*'
この機能の前に、両方のブランチとタグは定期的に削除され、アップストリームを反映するローカル参照があります。
職場では、各ロールアウトのレポジトリに展開タグを作成し、それらのlotsがあるため、パフォーマンス上の理由から数週間以内にアーカイブされます。
この変更なしでは
/etc/gitconfig
(それらの作業にのみ使用されるサーバー上)でそのようなリポジトリを一元的に設定することは困難です。fetch.Prune=true
をグローバルに設定する必要があります。その後、各リポジトリに対して:git -C {} config --replace-all remote.Origin.fetch "refs/tags/*:refs/tags/*" "^\+*refs/tags/\*:refs/tags/\*$"
これで、単純に
fetch.pruneTags=true
を/etc/gitconfig
にも設定でき、「git pull
」を実行しているユーザーは自動的に私が望む刈り込みセマンティクス。
次は私のために働いた:
git fetch --Prune --tags
gitには、ローカルタグと外部タグの違いを区別する方法がないことが少し研究されています(すべてのタグは.git/refs/tags /に移動します)。したがって、ローカルで作成されたタグとプルーニング可能なリモートタグの違いを判断することはできません。オプションは、次のように縮小されます。タグのセットが増え続けるか、サーバー上にあるタグのみになります。
git Push --tags Origin && \
git tag | xargs -n1 git tag -d && \
git fetch --tags
後者の動作のために最初の行を削除し、頻繁に使用するために潜在的にgit alias'dになる可能性があります。
別の方法としては、タグポイントにブランチを作成し(ローカル/リモートとして識別できるため)、再びブランチに書き込むことはありません。次に、remotename/branchnameをチェックアウトのタグとして使用すると、タグの同期が維持されます(git fetch
およびgit remote Prune remotename
)。
どちらの方法もハックであり、「正しい」答えはタグの変更を常に停止することです。
実際に私のために働く別のソリューション:
git tag -l | xargs git tag -d && git fetch -t
git Push --tagsは、ローカルタグをサーバーにプッシュします。デフォルトでは、git fetch(git pullまたはgit pull --rebaseの前半)はタグをプルしますが、-tまたは--tagsを指定してすべてをプルすることができます。
リモートで削除されたタグをプルーニングする方法はわかりませんが、フェッチは強制更新されたタグをプルダウンする必要があります。
免責事項これはgitの内部を使用します(ファイルシステムはis gitインターフェースであると主張する人もいるかもしれませんが、それは別の日です:D)
# Blow away all local tags, this will remove any that are tagged locally
# but are not on the remote
rm .git/refs/tags/*
# Download all the tags from the remote
git fetch --tags
代替ソリューションは次のとおりです。
git fetch -p +refs/tags/*:refs/tags/*
git fetch docから:
-p-プルーン
取得する前に、リモートに存在しなくなったリモート追跡参照を削除します。タグは、デフォルトのタグの自動追跡または--tagsオプションのためにのみ取得された場合、プルーニングの対象になりません。ただし、明示的なrefspecによりタグがフェッチされる場合(コマンドラインまたはリモート設定のいずれか、たとえば、リモートが--mirrorオプションでクローンされた場合)、thenまた、プルーニングの対象となります。
これらのコマンドを使用してタグを同期します(すべてのローカルを削除してから、すべてのリモートを取得します)
git tag -d $(git tag) # delete all local tags
git fetch --all # fetch all remote to local