リモートのタグとロックステップでローカルの git タグを維持する方法はありますか? つまり、作成時に新しいタグを取得するだけでなく (通常どおり、fetch
-ing/ pull
-ing の場合)、リモートに存在しないタグを削除し、他の誰かがタグを作成したときに既存のタグを削除しますgit push -f
。ブランチに対して同様の動作を実現するためにgit fetch remotename
フォローできることを知っています。git remote prune remotename
8 に答える
...また、リモートに存在しないタグを整理します
git fetch
Git 2.17 (2018 年第 2 四半期) では、ローカルに保持されている古いタグを取り除くための便利な省略形を取得します。
Commit 6317972、Commit 97716D2 、 Commit E249CE0、 Commit 627A129 、 Commit D0E0747 、 Commit 2C72ED7 、 E1790F9をコミット、 59CAF52のコミット、コミット8234E0、コミット6FB23F5、コミットCA3065EコミットメントCECH3065E、コミットメントCA3065E、コミットメントのコミットメントを参照してください。aa59e0e (2018 年 2 月 9 日) 著Ævar Arnfjörð Bjarmason ( )。(合併avar
Junio C Hamano -- gitster
-- in commit c1a7902、2018年 3 月 6 日)
fetch :
--prune-tags
オプションとfetch.pruneTags
構成を追加します
config オプションと省略形 ( is )と共に
--prune-tags
オプションをに追加します。 これにより、次のいずれかを実行できます。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/*'
この機能の前は、ブランチとタグの両方が定期的に削除されているレポからプルするユースケースをサポートし、ローカル参照をアップストリームに反映させるのは大変でした。
職場では、ロールアウトごとにリポジトリに配置タグを作成します。それらは多数あるため、パフォーマンス上の理由から数週間以内にアーカイブされます。
この変更がなければ、そのようなリポジトリを集中的に構成することは困難です
/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
、必要なプルーニング セマンティクスを自動的に取得します。
2021 年 4 月更新、Git for Windows 2.30.1 およびGitHub Desktop 2.8
prune
setと pruneTags
optionsがある場合に機能します。
cd C:\path\to\local\repo
git config fetch.prune true
git config fetch.pruneTags true
次に、GitHub Deskop で Fetch origin をクリックします。ログに次のように表示されます。
2021-04-28T20:25:21.244Z - info: [ui] Executing fetch:
git -c credential.helper= -c protocol.version=2 fetch --progress --prune origin (took 2.986s)
...そして、リモートに存在しないローカルタグはなくなります!
以下は私のために働いた:
git fetch --prune --tags
少し調べてみると、gitにはローカルタグと外部タグの違いを区別する方法がないことがわかっています(すべてのタグは.git / refs / tags /に移動します)。したがって、ローカルで作成されたタグとプルーニング可能なリモートタグの違いを判別することはできません。次に、オプションは次のように削減されます。増え続けるタグのセットを持つか、サーバー上にあるタグのみを持つ。
git push --tags origin && \
git tag | xargs -n1 git tag -d && \
git fetch --tags
後者の動作の最初の行を削除すると、頻繁に使用するためにgitエイリアスが作成される可能性があります。
別の方法は、タグポイントにブランチを作成し(ローカル/リモートとして識別できるため)、二度と書き込まれないようにすることです。次に、remotename / branchnameをタグとして使用してチェックアウトすると、タグの同期が維持されます(およびに加えてgit fetch
)git remote prune remotename
。
どちらの方法もハックであり、「正しい」答えは、タグの変更を常に停止することです。
git push --tagsは、ローカルタグをサーバーにプッシュします。デフォルトでは、git fetch(gitpullまたはgitpull --rebaseの前半)はタグをプルしますが、-tまたは--tagsを指定してすべてをプルすることができます。
リモートで削除されたタグを削除する方法がわかりませんが、フェッチによって強制的に更新されたタグがプルダウンされます。
免責事項これは git internals を使用します (ファイルシステムは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