PATH: //usr/libexec/git-core
FILE_BARU
CREATE
FOLDER_BARU
MKDIR
UPLOAD_FILE
GO
[ .. KEMBALI ]
📄 git
↓
X
📄 git-add
↓
X
📄 git-am
↓
X
📄 git-annotate
↓
X
📄 git-apply
↓
X
📄 git-archive
↓
X
📄 git-bisect
↓
X
📄 git-blame
↓
X
📄 git-branch
↓
X
📄 git-bugreport
↓
X
📄 git-bundle
↓
X
📄 git-cat-file
↓
X
📄 git-check-attr
↓
X
📄 git-check-ignore
↓
X
📄 git-check-mailmap
↓
X
📄 git-check-ref-format
↓
X
📄 git-checkout
↓
X
📄 git-checkout--worker
↓
X
📄 git-checkout-index
↓
X
📄 git-cherry
↓
X
📄 git-cherry-pick
↓
X
📄 git-clean
↓
X
📄 git-clone
↓
X
📄 git-column
↓
X
📄 git-commit
↓
X
📄 git-commit-graph
↓
X
📄 git-commit-tree
↓
X
📄 git-config
↓
X
📄 git-contacts
↓
X
📄 git-count-objects
↓
X
📄 git-credential
↓
X
📄 git-credential-cache
↓
X
📄 git-credential-cache--daemon
↓
X
📄 git-credential-netrc
↓
X
📄 git-credential-store
↓
X
📄 git-describe
↓
X
📄 git-diagnose
↓
X
📄 git-diff
↓
X
📄 git-diff-files
↓
X
📄 git-diff-index
↓
X
📄 git-diff-tree
↓
X
📄 git-difftool
↓
X
📄 git-difftool--helper
↓
X
📄 git-fast-export
↓
X
📄 git-fast-import
↓
X
📄 git-fetch
↓
X
📄 git-fetch-pack
↓
X
📄 git-filter-branch
↓
X
📄 git-fmt-merge-msg
↓
X
📄 git-for-each-ref
↓
X
📄 git-for-each-repo
↓
X
📄 git-format-patch
↓
X
📄 git-fsck
↓
X
📄 git-fsck-objects
↓
X
📄 git-fsmonitor--daemon
↓
X
📄 git-gc
↓
X
📄 git-get-tar-commit-id
↓
X
📄 git-grep
↓
X
📄 git-hash-object
↓
X
📄 git-help
↓
X
📄 git-hook
↓
X
📄 git-http-backend
↓
X
📄 git-http-fetch
↓
X
📄 git-http-push
↓
X
📄 git-imap-send
↓
X
📄 git-index-pack
↓
X
📄 git-init
↓
X
📄 git-init-db
↓
X
📄 git-interpret-trailers
↓
X
📄 git-log
↓
X
📄 git-ls-files
↓
X
📄 git-ls-remote
↓
X
📄 git-ls-tree
↓
X
📄 git-mailinfo
↓
X
📄 git-mailsplit
↓
X
📄 git-maintenance
↓
X
📄 git-merge
↓
X
📄 git-merge-base
↓
X
📄 git-merge-file
↓
X
📄 git-merge-index
↓
X
📄 git-merge-octopus
↓
X
📄 git-merge-one-file
↓
X
📄 git-merge-ours
↓
X
📄 git-merge-recursive
↓
X
📄 git-merge-resolve
↓
X
📄 git-merge-subtree
↓
X
📄 git-merge-tree
↓
X
📄 git-mergetool
↓
X
📄 git-mergetool--lib
↓
X
📄 git-mktag
↓
X
📄 git-mktree
↓
X
📄 git-multi-pack-index
↓
X
📄 git-mv
↓
X
📄 git-name-rev
↓
X
📄 git-notes
↓
X
📄 git-pack-objects
↓
X
📄 git-pack-redundant
↓
X
📄 git-pack-refs
↓
X
📄 git-patch-id
↓
X
📄 git-prune
↓
X
📄 git-prune-packed
↓
X
📄 git-pull
↓
X
📄 git-push
↓
X
📄 git-quiltimport
↓
X
📄 git-range-diff
↓
X
📄 git-read-tree
↓
X
📄 git-rebase
↓
X
📄 git-receive-pack
↓
X
📄 git-reflog
↓
X
📄 git-refs
↓
X
📄 git-remote
↓
X
📄 git-remote-ext
↓
X
📄 git-remote-fd
↓
X
📄 git-remote-ftp
↓
X
📄 git-remote-ftps
↓
X
📄 git-remote-http
↓
X
📄 git-remote-https
↓
X
📄 git-repack
↓
X
📄 git-replace
↓
X
📄 git-replay
↓
X
📄 git-request-pull
↓
X
📄 git-rerere
↓
X
📄 git-reset
↓
X
📄 git-restore
↓
X
📄 git-rev-list
↓
X
📄 git-rev-parse
↓
X
📄 git-revert
↓
X
📄 git-rm
↓
X
📄 git-send-pack
↓
X
📄 git-sh-i18n
↓
X
📄 git-sh-i18n--envsubst
↓
X
📄 git-sh-setup
↓
X
📄 git-shell
↓
X
📄 git-shortlog
↓
X
📄 git-show
↓
X
📄 git-show-branch
↓
X
📄 git-show-index
↓
X
📄 git-show-ref
↓
X
📄 git-sparse-checkout
↓
X
📄 git-stage
↓
X
📄 git-stash
↓
X
📄 git-status
↓
X
📄 git-stripspace
↓
X
📄 git-submodule
↓
X
📄 git-submodule--helper
↓
X
📄 git-switch
↓
X
📄 git-symbolic-ref
↓
X
📄 git-tag
↓
X
📄 git-unpack-file
↓
X
📄 git-unpack-objects
↓
X
📄 git-update-index
↓
X
📄 git-update-ref
↓
X
📄 git-update-server-info
↓
X
📄 git-upload-archive
↓
X
📄 git-upload-pack
↓
X
📄 git-var
↓
X
📄 git-verify-commit
↓
X
📄 git-verify-pack
↓
X
📄 git-verify-tag
↓
X
📄 git-version
↓
X
📄 git-web--browse
↓
X
📄 git-whatchanged
↓
X
📄 git-worktree
↓
X
📄 git-write-tree
↓
X
📁 mergetools/
X
📄 scalar
↓
X
SAVING...
BERHASIL DIUBAH!
EDITING: git-contacts
#!/usr/bin/perl # List people who might be interested in a patch. Useful as the argument to # git-send-email --cc-cmd option, and in other situations. # # Usage: git contacts <file | rev-list option> ... use strict; use warnings; use IPC::Open2; my $since = '5-years-ago'; my $min_percent = 10; my $labels_rx = qr/Signed-off-by|Reviewed-by|Acked-by|Cc|Reported-by/i; my %seen; sub format_contact { my ($name, $email) = @_; return "$name <$email>"; } sub parse_commit { my ($commit, $data) = @_; my $contacts = $commit->{contacts}; my $inbody = 0; for (split(/^/m, $data)) { if (not $inbody) { if (/^author ([^<>]+) <(\S+)> .+$/) { $contacts->{format_contact($1, $2)} = 1; } elsif (/^$/) { $inbody = 1; } } elsif (/^$labels_rx:\s+([^<>]+)\s+<(\S+?)>$/o) { $contacts->{format_contact($1, $2)} = 1; } } } sub import_commits { my ($commits) = @_; return unless %$commits; my $pid = open2 my $reader, my $writer, qw(git cat-file --batch); for my $id (keys(%$commits)) { print $writer "$id\n"; my $line = <$reader>; if ($line =~ /^([0-9a-f]{40}) commit (\d+)/) { my ($cid, $len) = ($1, $2); die "expected $id but got $cid\n" unless $id eq $cid; my $data; # cat-file emits newline after data, so read len+1 read $reader, $data, $len + 1; parse_commit($commits->{$id}, $data); } } close $reader; close $writer; waitpid($pid, 0); die "git-cat-file error: $?\n" if $?; } sub get_blame { my ($commits, $source, $from, $ranges) = @_; return unless @$ranges; open my $f, '-|', qw(git blame --porcelain -C), map({"-L$_->[0],+$_->[1]"} @$ranges), '--since', $since, "$from^", '--', $source or die; while (<$f>) { if (/^([0-9a-f]{40}) \d+ \d+ \d+$/) { my $id = $1; $commits->{$id} = { id => $id, contacts => {} } unless $seen{$id}; $seen{$id} = 1; } } close $f; } sub blame_sources { my ($sources, $commits) = @_; for my $s (keys %$sources) { for my $id (keys %{$sources->{$s}}) { get_blame($commits, $s, $id, $sources->{$s}{$id}); } } } sub scan_patches { my ($sources, $id, $f) = @_; my $source; while (<$f>) { if (/^From ([0-9a-f]{40}) Mon Sep 17 00:00:00 2001$/) { $id = $1; $seen{$id} = 1; } next unless $id; if (m{^--- (?:a/(.+)|/dev/null)$}) { $source = $1; } elsif (/^@@ -(\d+)(?:,(\d+))?/ && $source) { my $len = defined($2) ? $2 : 1; push @{$sources->{$source}{$id}}, [$1, $len] if $len; } } } sub scan_patch_file { my ($commits, $file) = @_; open my $f, '<', $file or die "read failure: $file: $!\n"; scan_patches($commits, undef, $f); close $f; } sub parse_rev_args { my @args = @_; open my $f, '-|', qw(git rev-parse --revs-only --default HEAD --symbolic), @args or die; my @revs; while (<$f>) { chomp; push @revs, $_; } close $f; return @revs if scalar(@revs) != 1; return "^$revs[0]", 'HEAD' unless $revs[0] =~ /^-/; return $revs[0], 'HEAD'; } sub scan_rev_args { my ($commits, $args) = @_; my @revs = parse_rev_args(@$args); open my $f, '-|', qw(git rev-list --reverse), @revs or die; while (<$f>) { chomp; my $id = $_; $seen{$id} = 1; open my $g, '-|', qw(git show -C --oneline), $id or die; scan_patches($commits, $id, $g); close $g; } close $f; } sub mailmap_contacts { my ($contacts) = @_; my %mapped; my $pid = open2 my $reader, my $writer, qw(git check-mailmap --stdin); for my $contact (keys(%$contacts)) { print $writer "$contact\n"; my $canonical = <$reader>; chomp $canonical; $mapped{$canonical} += $contacts->{$contact}; } close $reader; close $writer; waitpid($pid, 0); die "git-check-mailmap error: $?\n" if $?; return \%mapped; } if (!@ARGV) { die "No input revisions or patch files\n"; } my (@files, @rev_args); for (@ARGV) { if (-e) { push @files, $_; } else { push @rev_args, $_; } } my %sources; for (@files) { scan_patch_file(\%sources, $_); } if (@rev_args) { scan_rev_args(\%sources, \@rev_args) } my $toplevel = `git rev-parse --show-toplevel`; chomp $toplevel; chdir($toplevel) or die "chdir failure: $toplevel: $!\n"; my %commits; blame_sources(\%sources, \%commits); import_commits(\%commits); my $contacts = {}; for my $commit (values %commits) { for my $contact (keys %{$commit->{contacts}}) { $contacts->{$contact}++; } } $contacts = mailmap_contacts($contacts); my $ncommits = scalar(keys %commits); for my $contact (keys %$contacts) { my $percent = $contacts->{$contact} * 100 / $ncommits; next if $percent < $min_percent; print "$contact\n"; }
SIMPAN PERUBAHAN