web-dev-qa-db-ja.com

gitでは、リモートサーバーに対してタグを同期するにはどうすればよいですか?

リモートのタグを使用して、ローカルgitタグをロックステップに保持する方法はありますか?つまり、作成時に新しいタグを取得するだけでなく(通常、fetch- ing/pull- ingするとき)、リモートでプルーニングタグを削除し、既存のタグを削除するときにも他の誰かgit Push -fはタグです。自分ができるということがわかっている git fetch remotename に続く git remote Prune remotenameブランチに対して同様の動作を実現します。

43
mlb

...また、リモートにプルーニングタグがなくなりました

git fetchは、Git 2.17(2018年第2四半期)で、ローカルに保持されている古いタグを取り除くための便利な速記を取得します。

commit 6317972commit 97716d2commit e249cecommit 627a129commit d0e0747 を参照してください、 コミット2c72ed7コミットe1790f9コミット59caf52コミット82f34eコミット6fb23f5コミットca3065eコミットbf16ab7コミットeca142dコミット750d0daコミット071188commit ce3ab21commit 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」を実行しているユーザーは自動的に私が望む刈り込みセマンティクス。

20
VonC

次は私のために働いた:

git fetch --Prune --tags
41

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)。

どちらの方法もハックであり、「正しい」答えはタグの変更を常に停止することです。

17
mlb

実際に私のために働く別のソリューション:

git tag -l | xargs git tag -d && git fetch -t
6
Ron

git Push --tagsは、ローカルタグをサーバーにプッシュします。デフォルトでは、git fetch(git pullまたはgit pull --rebaseの前半)はタグをプルしますが、-tまたは--tagsを指定してすべてをプルすることができます。

リモートで削除されたタグをプルーニングする方法はわかりませんが、フェッチは強制更新されたタグをプルダウンする必要があります。

6
LJHarb

免責事項これは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
4
Anthony Sottile

代替ソリューションは次のとおりです。

git fetch -p +refs/tags/*:refs/tags/*

git fetch docから:

-p-プルーン

取得する前に、リモートに存在しなくなったリモート追跡参照を削除します。タグは、デフォルトのタグの自動追跡または--tagsオプションのためにのみ取得された場合、プルーニングの対象になりません。ただし、明示的なrefspecによりタグがフェッチされる場合(コマンドラインまたはリモート設定のいずれか、たとえば、リモートが--mirrorオプションでクローンされた場合)、thenまた、プルーニングの対象となります

0
solstice333

これらのコマンドを使用してタグを同期します(すべてのローカルを削除してから、すべてのリモートを取得します)

git tag -d $(git tag) # delete all local tags
git fetch --all # fetch all remote to local
0
xxy