Как убедиться, что фиксационные коммиты не слиты с основной веткой - PullRequest
0 голосов
/ 27 февраля 2019

Я часто использую git commit --fixup (или --squash), особенно при проверке кода.Очевидно, что эти коммиты в конечном итоге должны исчезнуть после git rebase --autosquash, но меня беспокоит, что я могу забыть перебазировать и объединить эти коммиты в master.По крайней мере, некоторые ветви не могут быть помещены с этими коммитами в них?

1 Ответ

0 голосов
/ 27 февраля 2019

Вы можете, по крайней мере, заблокировать любые нажатия, содержащие fixup!, с помощью хука pre-push ниже.

#! /usr/bin/perl

use strict;
use warnings;

use constant Z40 => '0' x 40;

my($remote,$url) = @ARGV;

my $abort_push = 0;
while (<STDIN>) {
  # <local ref> SP <local sha1> SP <remote ref> SP <remote sha1> LF
  my($lref,$lsha,$rref,$rsha) = split;

  if ($lsha eq Z40) {} # ignore deletes
  else {
    my $commit_range =
      $rsha eq Z40
        ? $lsha            # new branch: check all commits
        : "$rsha..$lsha";  # existing: check new commits since $rsha
    my @cmd = (qw/ git rev-list --pretty=oneline --grep ^fixup! /, $commit_range);

    open my $fh, "-|", @cmd or die "$0: failed to start git rev-list: $!";
    my @fixup_commits;
    while (<$fh>) { push @fixup_commits, "  - $_" }
    close $fh;

    if (@fixup_commits) {
      my $s = @fixup_commits == 1 ? "" : "s";
      warn "Remove fixup$s from $lref:\n", @fixup_commits;
      $abort_push = 1;
    }
  }
}

die "Push aborted.\n" if $abort_push;

Так, например, с историей

$ git lola
* 4a732d4 (HEAD -> feature/foo) fixup! fsdkfj
| * 478075c (master) w00t
| * 1d572d3 fixup! sdlkf
| * f9a55ee fixup! yo
|/  
* ea708b0 (origin/master) three
* d4276a2 two
* 6426569 hello

Попытка нажатьдает

$ git push origin master feature/foo
Remove fixups from refs/heads/master:
  - 1d572d32f963d6218ed3b92f69d58a8ec790d7ea fixup! sdlkf
  - f9a55ee14f28f9496e2aea1bc400ca65ae150f4b fixup! yo
Remove fixup from refs/heads/feature/foo:
  - 4a732d4601012246986037437ac0c0bab39dd0a9 fixup! fsdkfj
Push aborted.
error: failed to push some refs to [...]

Обратите внимание, что git lola является нестандартным, но очень полезным псевдонимом .Добавьте следующее к вашему глобальному .gitconfig.

[alias]
        lol = log --graph --decorate --pretty=oneline --abbrev-commit
        lola = log --graph --decorate --pretty=oneline --abbrev-commit --all
...