78

リモートのタグとロックステップでローカルの git タグを維持する方法はありますか? つまり、作成時に新しいタグを取得するだけでなく (通常どおり、fetch-ing/ pull-ing の場合)、リモートに存在しないタグを削除し、他の誰かがタグを作成したときに既存のタグを削除しますgit push -f。ブランチに対して同様の動作を実現するためにgit fetch remotenameフォローできることを知っています。git remote prune remotename

4

8 に答える 8

68

...また、リモートに存在しないタグを整理します

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

Commit 6317972Commit 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-fetchfetch.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と pruneTagsoptionsがある場合に機能します。

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)

...そして、リモートに存在しないローカルタグはなくなります!

于 2018-03-10T23:46:37.707 に答える
50

以下は私のために働いた:

git fetch --prune --tags
于 2013-05-22T15:05:57.297 に答える
21

少し調べてみると、gitにはローカルタグと外部タグの違いを区別する方法がないことがわかっています(すべてのタグは.git / refs / tags /に移動します)。したがって、ローカルで作成されたタグとプルーニング可能なリモートタグの違いを判別することはできません。次に、オプションは次のように削減されます。増え続けるタグのセットを持つか、サーバー上にあるタグのみを持つ。

git push --tags origin && \
git tag | xargs -n1 git tag -d && \
git fetch --tags

後者の動作の最初の行を削除すると、頻繁に使用するためにgitエイリアスが作成される可能性があります。

別の方法は、タグポイントにブランチを作成し(ローカル/リモートとして識別できるため)、二度と書き込まれないようにすることです。次に、remotename / branchnameをタグとして使用してチェックアウトすると、タグの同期が維持されます(およびに加えてgit fetchgit remote prune remotename

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

于 2012-05-17T22:11:30.757 に答える
7

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

リモートで削除されたタグを削除する方法がわかりませんが、フェッチによって強制的に更新されたタグがプルダウンされます。

于 2012-05-08T01:26:25.033 に答える
5

免責事項これは 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
于 2016-11-14T23:45:26.080 に答える