Tôi đã thấy một số sách và bài viết có một số biểu đồ thực sự đẹp mắt của các chi nhánh và cam kết. Làm cách nào tôi có thể tạo hình ảnh có thể in chất lượng cao của lịch sử git?
Tôi đã thấy một số sách và bài viết có một số biểu đồ thực sự đẹp mắt của các chi nhánh và cam kết. Làm cách nào tôi có thể tạo hình ảnh có thể in chất lượng cao của lịch sử git?
Câu trả lời:
Cập nhật: Câu trả lời này đã nhận được nhiều sự chú ý hơn nó xứng đáng. Ban đầu nó được đăng bởi vì tôi nghĩ rằng các biểu đồ trông rất đẹp và chúng có thể được vẽ trong Illustrator cho một ấn phẩm thành công và không có giải pháp nào tốt hơn. Nhưng hiện tại đã tồn tại nhiều câu trả lời phù hợp hơn cho Q này, chẳng hạn như fracz ', Jubobs ' hay Harry Lee ! Hãy đi upvote những !!
Cập nhật 2: Tôi đã đăng một phiên bản cải tiến của câu trả lời này lên cấu trúc liên kết nhánh Trực quan hóa trong câu hỏi git , vì nó phù hợp hơn nhiều ở đó. Phiên bản đó bao gồm lg3
, hiển thị cả thông tin về tác giả và thông tin, vì vậy bạn thực sự nên kiểm tra nó. Để lại câu trả lời này cho các lý do lịch sử (& rep, tôi sẽ thừa nhận), mặc dù tôi thực sự muốn xóa nó.
2 : Tôi có hai bí danh tôi thường ném vào ~/.gitconfig
tệp của mình :
[alias]
lg1 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)' --all
lg2 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n'' %C(white)%s%C(reset) %C(dim white)- %an%C(reset)' --all
lg = !"git lg1"
git lg
/ git lg1
trông như thế này:
và git lg2
trông như thế này:
#202020
/ #555555
, Đỏ: #5d1a14
/ #da4939
, Xanh lục: #424e24
/ #a5c261
, Vàng: #6f5028
/ #ffc66d
, Xanh lam: #263e4e
/ #6d9cbe
, Đỏ tươi: #3e1f50
/ #a256c7
, Lục lam: #234e3f
/ #62c1a1
, và Trắng: #979797
/ #ffffff
.
--date=relative
và --abbrev-commit
là dư thừa vì bạn sử dụng rõ ràng %cr
và %h
, tương ứng.
%C(auto)
sửa đổi vào tên họ ( %d
) để có màu sắc đẹp hơn. Xem stackoverflow.com/questions/5889878/color-in-git-log/
lg = log --graph --abbrev-commit --decorate --format=format:'%C(yellow)%h%C(reset)%C(auto)%d%C(reset) %C(normal)%s%C(reset) %C(dim white)%an%C(reset) %C(dim blue)(%ar)%C (reset)' --all
Nhiều câu trả lời ở đây là tuyệt vời, nhưng đối với những người chỉ muốn một dòng đơn giản cho câu trả lời điểm mà không phải thiết lập bí danh hoặc bất cứ điều gì thêm, đây là:
git log --all --decorate --oneline --graph
Không phải ai cũng sẽ làm git log
tất cả thời gian, nhưng khi bạn cần nó chỉ cần nhớ:
" A Dog " = git log - a ll - d ecative - o neline - g raph
git config --global alias.adog "log --all --decorate --oneline --graph"
--all
lâu nay tôi sắp khóc (T_T) CẢM ƠN BẠN!
Đối với đầu ra văn bản, bạn có thể thử:
git log --graph --abbrev-commit --decorate --date=relative --all
hoặc là:
git log --graph --oneline --decorate --all
hoặc: đây là bí danh graphviz để vẽ biểu đồ DAG.
--abbrev-commit --decorate
, và sau đó nó hoàn hảo!
--abbrev-commit
nếu bạn sử dụng--oneline
git log --graph --oneline --decorate --date=relative --all
, --date
đối số là vô ích. Tôi có thể thấy không có ngày hiển thị trong nhật ký.
Gitgraph.js cho phép vẽ các nhánh git đẹp mà không cần kho lưu trữ. Chỉ cần viết mã Javascript để cấu hình các nhánh của bạn và xác nhận và hiển thị nó trong trình duyệt.
var gitGraph = new GitGraph({
template: "blackarrow",
mode: "compact",
orientation: "horizontal",
reverseArrow: true
});
var master = gitGraph.branch("master").commit().commit();
var develop = gitGraph.branch("develop").commit();
master.commit();
develop.commit().commit();
develop.merge(master);
hoặc với metro
mẫu:
hoặc với các thông điệp cam kết, tác giả và thẻ:
Kiểm tra nó với JSFiddle .
Tạo nó với Git Gograph bởi @bsara.
Được xây dựng trên đỉnh TikZ & PGF , gitdags
là một gói LaTeX nhỏ cho phép bạn dễ dàng tạo ra các biểu đồ cam kết đồ họa vector , v.v.
Việc tạo tự động đồ thị cam kết của kho lưu trữ hiện tại không phải là mục đích của gitdags
; các đồ thị nó tạo ra chỉ có ý nghĩa cho mục đích giáo dục .
Tôi thường sử dụng nó để tạo các biểu đồ cho câu trả lời của mình cho các câu hỏi Git, như là một thay thế cho biểu đồ cam kết ASCII:
Dưới đây là một ví dụ về biểu đồ như vậy chứng minh tác dụng của một rebase đơn giản:
\documentclass{article}
\usepackage{subcaption}
\usepackage{gitdags}
\begin{document}
\begin{figure}
\begin{subfigure}[b]{\textwidth}
\centering
\begin{tikzpicture}
% Commit DAG
\gitDAG[grow right sep = 2em]{
A -- B -- {
C,
D -- E,
}
};
% Tag reference
\gittag
[v0p1] % node name
{v0.1} % node text
{above=of A} % node placement
{A} % target
% Remote branch
\gitremotebranch
[origmaster] % node name
{origin/master} % node text
{above=of C} % node placement
{C} % target
% Branch
\gitbranch
{master} % node name and text
{above=of E} % node placement
{E} % target
% HEAD reference
\gitHEAD
{above=of master} % node placement
{master} % target
\end{tikzpicture}
\subcaption{Before\ldots}
\end{subfigure}
\begin{subfigure}[b]{\textwidth}
\centering
\begin{tikzpicture}
\gitDAG[grow right sep = 2em]{
A -- B -- {
C -- D' -- E',
{[nodes=unreachable] D -- E },
}
};
% Tag reference
\gittag
[v0p1] % node name
{v0.1} % node text
{above=of A} % node placement
{A} % target
% Remote branch
\gitremotebranch
[origmaster] % node name
{origin/master} % node text
{above=of C} % node placement
{C} % target
% Branch
\gitbranch
{master} % node name and text
{above=of E'} % node placement
{E'} % target
% HEAD reference
\gitHEAD
{above=of master} % node placement
{master} % target
\end{tikzpicture}
\subcaption{\ldots{} and after \texttt{git rebase origin/master}}
\end{subfigure}
\caption{Demonstrating a typical \texttt{rebase}}
\end{figure}
\end{document}
:)
latex input.tex
để tạo dvi, và cuối cùng sử dụng dvisvgm input.dvi
để tạo ra một SVG với tính minh bạch. Chuyển đổi từ SVG sang định dạng raster như PNG là đủ dễ dàng với convert -antialias -density 300 -background none input.svg output.png
. Nhân tiện, những hình ảnh này trông tuyệt vời với sự minh bạch đầy đủ. Vẫn đang xử lý vấn đề về phông chữ ... i.imgur.com/1Xu2Ry5.png
gitdags
là trên đường!
Gitg là một bản sao của Gitk và GitX cho Gnome (nó cũng hoạt động trên KDE, v.v.) hiển thị một biểu đồ có màu khá đẹp.
Nó được tích cực phát triển (tính đến năm 2012). Nó cho phép bạn sắp xếp các xác nhận (các nút biểu đồ) theo thứ tự thời gian hoặc theo cấu trúc liên kết và ẩn các xác nhận không dẫn đến một nhánh được chọn.
Nó hoạt động tốt với kho lớn và đồ thị phụ thuộc phức tạp.
Ảnh chụp màn hình mẫu, hiển thị kho lưu trữ linux-git và linux-2.6:
SourceTree là một trong những thực sự tốt. Nó in ra một biểu đồ chi nhánh và lịch sử kích thước trung bình và đẹp mắt: (sau đây được thực hiện trên một dự án Git thử nghiệm chỉ để xem một số chi nhánh). Hỗ trợ Windows 7+ và Mac OS X 10.6+.
Tôi vừa viết một công cụ có thể tạo biểu đồ cam kết đẹp bằng HTML / Canvas.
Và cung cấp một plugin jQuery giúp dễ sử dụng.
[github] https://github.com/tclh123/commits-graph
Xem trước:
git-forest
là một tập lệnh perl tuyệt vời mà tôi đã sử dụng trong hơn một năm và tôi hầu như không sử dụng git log
lệnh trực tiếp nữa.
Đây là một số điều tôi thích về kịch bản này:
--reverse
với đầu ra đồ thị, điều này là không thể với git log
lệnh thông thường .git log
nội bộ để lấy danh sách các cam kết, vì vậy tất cả các tùy chọn mà bạn chuyển đến git log
cũng có thể được chuyển đến tập lệnh này.Tôi có một bí danh sử dụng git-forest
như sau:
[alias]
tree = "forest --pretty=format:\"%C(red)%h %C(magenta)(%ar) %C(blue)%an %C(reset)%s\" --style=15 --reverse"
Đây là cách đầu ra trông như thế nào trên một thiết bị đầu cuối:
Tôi đã viết một công cụ web để chuyển đổi nhật ký git thành các biểu đồ SVG đẹp mắt: Bit-Booster - Công cụ vẽ biểu đồ cam kết ngoại tuyến
Tải đầu ra từ git log --pretty='%h|%p|%d'
trực tiếp vào công cụ và sau đó nhấp vào liên kết "tải xuống graph.svg".
Công cụ này hoàn toàn ở phía máy khách và vì vậy không có dữ liệu Git nào của bạn được chia sẻ với máy chủ của tôi. Bạn cũng có thể lưu HTML + JS cục bộ và chạy nó bằng URL "file: ///". Đã xác minh trên Chrome 48 và Firefox 43 trên Ubuntu 12.04.
Nó tạo ra HTML có thể được đăng trực tiếp vào bất kỳ trang nào (bao gồm cả công cụ viết blog blogspot!). Hãy xem một số bài viết trên blog ở đây:
http://bit-booster.blogspot.ca/
Dưới đây là ảnh chụp màn hình của tệp HTML mẫu được tạo bởi công cụ:
http://bit-booster.com/graph.html (công cụ)
Dựa trên tập lệnh Graphviz mà tôi tìm thấy trong câu trả lời cho một câu hỏi liên quan , tôi đã hack một tập lệnh ruby để tạo ra một cái nhìn tóm tắt về kho lưu trữ git. Nó phù hợp với tất cả lịch sử tuyến tính và chỉ hiển thị các cam kết "thú vị", tức là những người có nhiều cha mẹ, nhiều con hoặc được chỉ bởi một nhánh hoặc thẻ. Đây là một đoạn của biểu đồ mà nó tạo ra cho jquery :
git-big-hình và BranchMaster là những công cụ tương tự cố gắng chỉ hiển thị cấu trúc cấp cao của biểu đồ, bằng cách chỉ hiển thị cách các thẻ, nhánh, sáp nhập, v.v.
Câu hỏi này có một số tùy chọn hơn.
Tôi đã thêm ba lệnh tùy chỉnh: git tree
, git stree
và git vtree
. Tôi sẽ đi qua chúng theo thứ tự đó.
[alias]
tree = log --all --graph --decorate=short --color --format=format:'%C(bold blue)%h%C(reset) %C(auto)%d%C(reset)\n %C(black)[%cr]%C(reset) %x09%C(black)%an: %s %C(reset)'
Với git stree
và git vtree
tôi đã sử dụng bash để giúp định dạng.
[alias]
logx = log --all --graph --decorate=short --color --format=format:'%C(bold blue)%h%C(reset)+%C(dim black)(%cr)%C(reset)+%C(auto)%d%C(reset)++\n+++ %C(bold black)%an%C(reset)%C(black): %s%C(reset)'
stree = !bash -c '" \
while IFS=+ read -r hash time branch message; do \
timelength=$(echo \"$time\" | sed -r \"s:[^ ][[]([0-9]{1,2}(;[0-9]{1,2})?)?m::g\"); \
timelength=$(echo \"16+${#time}-${#timelength}\" | bc); \
printf \"%${timelength}s %s %s %s\n\" \"$time\" \"$hash\" \"$branch\" \"\"; \
done < <(git logx && echo);"'
[alias]
logx = log --all --graph --decorate=short --color --format=format:'%C(bold blue)%h%C(reset)+%C(dim black)(%cr)%C(reset)+%C(auto)%d%C(reset)++\n+++ %C(bold black)%an%C(reset)%C(black): %s%C(reset)'
vtree = !bash -c '" \
while IFS=+ read -r hash time branch message; do \
timelength=$(echo \"$time\" | sed -r \"s:[^ ][[]([0-9]{1,2}(;[0-9]{1,2})?)?m::g\"); \
timelength=$(echo \"16+${#time}-${#timelength}\" | bc); \
printf \"%${timelength}s %s %s %s\n\" \"$time\" \"$hash\" \"$branch\" \"$message\"; \
done < <(git logx && echo);"'
EDIT: Điều này hoạt động với phiên bản git 1.9a. Giá trị màu 'tự động' dường như xuất hiện lần đầu trong phiên bản này. Đây là một bổ sung tốt vì tên chi nhánh sẽ có màu khác. Điều này giúp dễ dàng phân biệt giữa các nhánh cục bộ và từ xa chẳng hạn.
fatal: bad color value 'auto' for variable '--pretty format'
:(
sed: illegal option -- r
Phụ thuộc vào những gì họ trông giống như. Tôi sử dụng gitx để tạo ra hình ảnh như thế này:
Bạn có thể so sánh git log --graph
với gitk trên hợp nhất bạch tuộc 24 chiều (ban đầu từ http://clojure-log.n01se.net/date/2008-12-24.html ):
Để biết thêm chi tiết về văn bản, vui lòng thử:
git log --graph --date-order -C -M --pretty=format:"<%h> %ad [%an] %Cgreen%d%Creset %s" --all --date=short
Bạn có thể viết bí danh bằng $ HOME / .gitconfig
[alias]
graph = log --graph --date-order -C -M --pretty=format:\"<%h> %ad [%an] %Cgreen%d%Creset %s\" --all --date=short
git hist
- Hiển thị lịch sử của chi nhánh hiện tại
git hist --all
- Hiển thị biểu đồ của tất cả các chi nhánh (bao gồm cả điều khiển từ xa)
git hist master devel
- Hiển thị mối quan hệ giữa hai hoặc nhiều chi nhánh
git hist --branches
- Hiển thị tất cả các chi nhánh địa phương
Thêm vào --topo-order
để sắp xếp các cam kết theo cấu trúc liên kết, thay vì theo ngày (mặc định trong bí danh này)
--decorate
, vì vậy với các màu riêng biệt cho các tên nhánh khác nhaugit config --global alias.hist "log --graph --date-order --date=short \
--pretty=format:'%C(auto)%h%d %C(reset)%s %C(bold blue)%ce %C(reset)%C(green)%cr (%cd)'"
gitg : trình xem kho lưu trữ dựa trên gtk, đó là
http://git.gnome.org/browse/gitg mới nhưng
hiện tại tôi đang sử dụng nó
GitX
và khá tốt ở đó. Đề xuất
Mặc dù đôi khi tôi sử dụng gitg , luôn quay lại dòng lệnh:
[alias]
#quick look at all repo
loggsa = log --color --date-order --graph --oneline --decorate --simplify-by-decoration --all
#quick look at active branch (or refs pointed)
loggs = log --color --date-order --graph --oneline --decorate --simplify-by-decoration
#extend look at all repo
logga = log --color --date-order --graph --oneline --decorate --all
#extend look at active branch
logg = log --color --date-order --graph --oneline --decorate
#Look with date
logda = log --color --date-order --date=local --graph --format=\"%C(auto)%h%Creset %C(blue bold)%ad%Creset %C(auto)%d%Creset %s\" --all
logd = log --color --date-order --date=local --graph --format=\"%C(auto)%h%Creset %C(blue bold)%ad%Creset %C(auto)%d%Creset %s\"
#Look with relative date
logdra = log --color --date-order --graph --format=\"%C(auto)%h%Creset %C(blue bold)%ar%Creset %C(auto)%d%Creset %s\" --all
logdr = log --color --date-order --graph --format=\"%C(auto)%h%Creset %C(blue bold)%ar%Creset %C(auto)%d%Creset %s\"
loga = log --graph --color --decorate --all
# For repos without subject body commits (vim repo, git-svn clones)
logt = log --graph --color --format=\"%C(auto)%h %d %<|(100,trunc) %s\"
logta = log --graph --color --format=\"%C(auto)%h %d %<|(100,trunc) %s\" --all
logtsa = log --graph --color --format=\"%C(auto)%h %d %<|(100,trunc) %s\" --all --simplify-by-decoration
Như bạn có thể thấy gần như là một bí danh tiết kiệm tổ hợp phím, dựa trên:
Xem trong phiên bản gần đây của git (1.8.5 trở lên), bạn có thể hưởng lợi từ% C (tự động) trong giữ chỗ trang trí% d
Từ đây, tất cả những gì bạn cần là hiểu rõ về gitrevutions để lọc bất cứ thứ gì bạn cần (một cái gì đó như master..develop, trong đó --simplify-sáp nhập có thể giúp với các nhánh dài hạn)
Sức mạnh đằng sau dòng lệnh là cấu hình nhanh dựa trên nhu cầu của bạn (hiểu rằng repo không phải là cấu hình nhật ký khóa duy nhất, do đó, việc thêm --numstat hoặc --raw hoặc --name-status đôi khi cần thiết. và bí danh là nhanh, mạnh mẽ và (theo thời gian) biểu đồ đẹp nhất bạn có thể đạt được. Thậm chí, với đầu ra được hiển thị theo mặc định thông qua một máy nhắn tin (nói ít hơn), bạn luôn có thể tìm kiếm nhanh trong kết quả. Bạn không thể thuyết phục kết quả với các dự án như gitgraph
Rất ít điều chỉnh câu trả lời tuyệt vời của Slipp , bạn có thể sử dụng bí danh của mình để đăng nhập chỉ một nhánh:
[alias]
lgBranch1 = log --graph --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(bold white)— %an%C(reset)%C(bold yellow)%d%C(reset)' --abbrev-commit --date=relative
lgBranch2 = log --graph --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n'' %C(white)%s%C(reset) %C(bold white)— %an%C(reset)' --abbrev-commit
lg = !"git lg1"
Bằng cách rời khỏi --all
bây giờ bạn có thể làm
git lgBranch1 <branch name>
hoặc thậm chí
git lgBranch1 --all
Tôi đề nghị tig
https://github.com/jonas/tig
, một công cụ dòng lệnh tốt hơn nhiều cho git.
Bạn có thể sử dụng homebrew để cài đặt tig trên macOS:
$ brew install tig
$ tig
Tôi có git log
bí danh này ~/.gitconfig
để xem lịch sử biểu đồ:
[alias]
l = log --all --graph --pretty=format:'%C(auto)%h%C(auto)%d %s %C(dim white)(%aN, %ar)'
Với vị trí này, git l
sẽ xuất ra một cái gì đó như:
Trong Git 2.12 +, bạn thậm chí có thể tùy chỉnh màu đường của biểu đồ bằng log.graphColors
tùy chọn cấu hình.
Đối với định dạng của nhật ký, nó tương tự như --oneline
, với việc thêm tên tác giả (tôn trọng .mailmap
) và ngày tác giả tương đối . Lưu ý rằng %C(auto)
cú pháp yêu cầu Git sử dụng màu mặc định cho hàm băm xác nhận, v.v. được hỗ trợ trong Git> = 1.8.3 .
git log --graph --oneline
chỉ để đảm bảo oneliner không bị lạc
GitGraph
Tạo đại diện PNG hoặc SVG về lịch sử cam kết của kho lưu trữ Git của bạn.
Hãy thử ditaa . Nó có thể biến đổi bất kỳ sơ đồ ASCII thành hình ảnh. Mặc dù không được thiết kế với các nhánh Git, tôi rất ấn tượng với kết quả này.
Nguồn (tệp txt):
+--------+
| hotfix |
+---+----+
|
--*<---*<---*
^
|
\--*<---*
|
+---+----+
| master |
+--------+
Chỉ huy:
java -jar ditaa0_9.jar ascii-graph.txt
Kết quả:
Nó cũng hỗ trợ màu nền, đường nét đứt, hình dạng khác nhau và nhiều hơn nữa. Xem các ví dụ .
Nếu kho lưu trữ của bạn nằm trên Gitlab, bạn có thể sử dụng biểu diễn đồ thị của nó như được hiển thị dưới dạng SVG trong trình duyệt của bạn.
Chuyển đến chế độ xem biểu đồ của kho lưu trữ của bạn, ví dụ: https://gitlab.com/gitlab-org/gitter/webapp/network/develop
Cuộn biểu đồ xuống phía dưới (nó lười tải cam kết!)
Sử dụng trình kiểm tra trình duyệt của bạn để sao chép phần tử SVG sang tệp mới
Mở nó trong trình kết xuất mà bạn chọn, ví dụ: Inkscape
Tôi không biết về một công cụ trực tiếp, nhưng có lẽ bạn có thể hack một tập lệnh để xuất dữ liệu sang định dạng dấu chấm và kết xuất nó bằng graphviz.
io
lệnh đó thành các lệnh đơn giản perl `git log [...]` làm việc cho tôi.
brew install perl dot
và sau đó cpan common::sense IO::all
để có được các phụ thuộc. Sau đó, chỉ cần dẫn đầu ra cho một lệnh thích hợp, như git-graphviz | dot -Tpng -o repo.png
. Tuy nhiên, đầu ra không khác nhiều so với git-big-hình .
Có một biểu đồ cam kết Git thú vị là một trong những bản demo của Raphael thư viện đồ họa web .
Bản demo là tĩnh, nhưng nó đủ dễ để lấy mã và trao đổi dữ liệu tĩnh của chúng để lấy một bộ dữ liệu trực tiếp - Tôi nghĩ đó chỉ là Git commit data ở định dạng JSON.
Bản demo ở đây: http://dmitrybaranovskiy.github.io/raphael/github/impact.html
Một đầu ra biểu đồ git tablelike đẹp và sạch sẽ cho shell
với băm như bình thường bên cạnh cây đồ thị
hoặc trong một cột thêm
Chỉnh sửa : Bạn muốn bắt đầu ngay mà không cần đọc giải thích? Sử dụng các bí danh git, đoạn mã hoặc đoạn mã chức năng từ phần EDIT 5 bên dưới.
Trong tất cả các câu trả lời cho câu hỏi này, không có kết quả nào cho thấy đầu ra rõ ràng giống như tablelike. Gần nhất là câu trả lời này từ các sách phúc âm nơi tôi bắt đầu.
Điểm cốt lõi trong cách tiếp cận của tôi là chỉ đếm các ký tự cây được hiển thị cho người dùng. Sau đó điền chúng vào một chiều dài cá nhân với khoảng trắng.
Khác với git bạn cần những công cụ này
chủ yếu là trên tàu với bất kỳ phân phối linux.
Đoạn mã là
while IFS=+ read -r graph hash time branch message;do
# count needed amount of whitespaces and create them
whitespaces=$((9-$(sed -nl1000 'l' <<< "$graph" | grep -Eo '\\\\|\||\/|\ |\*|_' | wc -l)))
whitespaces=$(seq -s' ' $whitespaces|tr -d '[:digit:]')
# show hashes besides the tree ...
#graph_all="$graph_all$graph$(printf '%7s' "$hash")$whitespaces \n"
# ... or in an own column
graph_all="$graph_all$graph$whitespaces\n"
hash_all="$hash_all$(printf '%7s' "$hash") \n"
# format all other columns
time_all="$time_all$(printf '%12s' "$time") \n"
branch_all="$branch_all$(printf '%15s' "$branch")\n"
message_all="$message_all$message\n"
done < <(git log --all --graph --decorate=short --color --pretty=format:'+%C(bold 214)%<(7,trunc)%h%C(reset)+%C(dim white)%>(12,trunc)%cr%C(reset)+%C(214)%>(15,trunc)%d%C(reset)+%C(white)%s%C(reset)' && echo);
# paste the columns together and show the tablelike output
paste -d' ' <(echo -e "$time_all") <(echo -e "$branch_all") <(echo -e "$graph_all") <(echo -e "$hash_all") <(echo -e "$message_all")
Để tính toán khoảng trắng cần thiết, chúng tôi sử dụng
sed -nl500 'l' <<< "$graph"
để có được tất cả các ký tự (đến 500 trên mỗi dòng), chỉ chọn các ký tự cây: * | / \ _ và khoảng trắng với
grep -Eo '\\\\|\||\/|\ |\*|_'
cuối cùng đếm chúng và trừ kết quả từ giá trị độ dài được chọn của chúng tôi, là 9 trong ví dụ.
Để tạo ra số lượng khoảng trắng được tính toán, chúng tôi sử dụng
seq -s' ' $whitespaces
và cắt các số vị trí với
tr -d '[:digit:]'
hơn là thêm chúng vào cuối dòng biểu đồ của chúng tôi. Đó là nó!
Git có tùy chọn đẹp để định dạng độ dài của các chỉ định đầu ra đã có cú pháp'%><(amount_of_characters,truncate_option)'
, bổ sung khoảng trắng từ bên trái '>' hoặc bên phải '<' và có thể cắt bớt các ký tự từ đầu 'ltrunc', giữa 'mtrunc' hoặc end 'cắt ngắn'.
Điều quan trọng là các printf cmd ở trên sử dụng cùng các giá trị độ dài cho cột git tương ứng.
Hãy vui vẻ để tạo kiểu đầu ra rõ ràng giống như bàn của bạn theo nhu cầu của bạn.
Thêm:
Để có được giá trị độ dài phù hợp, bạn có thể sử dụng đoạn mã sau
while read -r graph;do
chars=$(sed -nl1000 'l' <<< "$graph" | grep -Eo '\\\\|\||\/|\ |\*|_' | wc -l)
[[ $chars -gt ${max_chars:-0} ]] && max_chars=$chars
done < <(git log --all --graph --pretty=format:' ')
và sử dụng $ max_chars làm giá trị độ dài phù hợp ở trên.
EDIT 1 : Chỉ cần lưu ý rằng charater gạch chân cũng được sử dụng trong cây git và chỉnh sửa các đoạn mã ở trên cho phù hợp. Nếu có những nhân vật khác bị mất, xin vui lòng để lại nhận xét.
EDIT 2 : Nếu bạn muốn thoát khỏi dấu ngoặc quanh các mục nhập chi nhánh và thẻ, chỉ cần sử dụng "% D" thay vì "% d" trong lệnh git, như trong EDIT 3.
EDIT 3 : Có lẽ tùy chọn màu "tự động" là tùy chọn bạn thích nhất cho các mục nhập chi nhánh và thẻ?
Thay đổi phần này của lệnh git (màu 214 )
%C(214)%>(15,trunc)%D%C(reset)
để tự động
%C(auto)%>(15,trunc)%D%C(reset)
EDIT 4 : Hoặc bạn thích phối màu của riêng bạn cho phần đó, một đầu ra lạ mắt với đầu nhấp nháy?
Để có thể định kiểu đầu, tên nhánh và thẻ trước tiên, chúng ta cần tùy chọn màu "tự động" trong lệnh git của chúng tôi như trong EDIT 3.
Sau đó, chúng ta có thể thay thế các giá trị màu đã biết bằng cách thêm 3 dòng này
# branch name styling
branch=${branch//1;32m/38;5;214m}
# head styling
branch=${branch//1;36m/3;5;1;38;5;196m}
# tag styling
branch=${branch//1;33m/1;38;5;222m}
ngay trước dòng
branch_all="$branch_all$(printf '%15s' "$branch")\n"
trong đoạn mã của chúng tôi. Các giá trị thay thế tạo ra các màu trên.
Ví dụ: giá trị thay thế cho đầu là
3;5;1;38;5;196
trong đó 3; viết tắt của chữ nghiêng, 5; cho nhấp nháy và 1; 38; 5; 196 cho màu. Để biết thêm thông tin bắt đầu ở đây. Lưu ý: Hành vi này phụ thuộc vào thiết bị đầu cuối yêu thích của bạn và do đó có thể không sử dụng được.
NHƯNG bạn có thể chọn bất kỳ giá trị màu nào bạn thích.
TỔNG QUAN về các giá trị màu git và tương đương ANSI
Bạn tìm thấy một danh sách với tùy chọn màu git / phong cách ở đây .
Nếu bạn cần đầu ra trên bảng điều khiển của mình để có màu chính xác (hình trên được thu nhỏ lại theo stackoverflow), bạn có thể tạo đầu ra với
for ((i=0;i<=255;i++));do
while IFS='+' read -r tree hash;do
echo -e "$(printf '%-10s' "(bold $i)") $hash $(sed -nl500 'l' <<< "$hash"|grep -Eom 1 '[0-9;]*[0-9]m'|tr -d 'm')"
done < <(git log --all --graph --decorate=short --color --pretty=format:'+%C(bold '$i')%h%C(reset)'|head -n 1)
done
trong đường dẫn dự án git của bạn sử dụng cam kết đầu tiên từ đầu ra nhật ký git của bạn.
EDIT 5 : Như thành viên "Andras Deak" đã đề cập, có một số cách sử dụng mã này:
1) dưới dạng bí danh :
bí danh không chấp nhận tham số nhưng một hàm có thể , do đó chỉ cần xác định trong .bashrc của bạn
function git_tably () {
unset branch_all graph_all hash_all message_all time_all max_chars
### add here the same code as under "2) as a shell-script" ###
}
và gọi hàm git_tossible (xuất phát từ tablelike) ngay dưới đường dẫn dự án git của bạn hoặc từ bất cứ nơi nào bạn muốn với đường dẫn dự án git của bạn làm tham số đầu tiên.
2) dưới dạng shell-script :
Tôi sử dụng nó với tùy chọn để chuyển một thư mục dự án git làm tham số đầu tiên cho nó hoặc nếu trống, hãy lấy thư mục làm việc như hành vi bình thường. Trong toàn bộ chúng ta có
# edit your color/style preferences here or use empty values for git auto style
tag_style="1;38;5;222"
head_style="1;3;5;1;38;5;196"
branch_style="38;5;214"
# determine the max character length of your git tree
while IFS=+ read -r graph;do
chars_count=$(sed -nl1000 'l' <<< "$graph" | grep -Eo '\\\\|\||\/|\ |\*|_' | wc -l)
[[ $chars_count -gt ${max_chars:-0} ]] && max_chars=$chars_count
done < <(cd "${1:-"$PWD"}" && git log --all --graph --pretty=format:' ')
# create the columns for your prefered tablelike git graph output
while IFS=+ read -r graph hash time branch message;do
# count needed amount of whitespaces and create them
whitespaces=$(($max_chars-$(sed -nl1000 'l' <<< "$graph" | grep -Eo '\\\\|\||\/|\ |\*|_' | wc -l)))
whitespaces=$(seq -s' ' $whitespaces|tr -d '[:digit:]')
# show hashes besides the tree ...
#graph_all="$graph_all$graph$(printf '%7s' "$hash")$whitespaces \n"
# ... or in an own column
graph_all="$graph_all$graph$whitespaces\n"
hash_all="$hash_all$(printf '%7s' "$hash") \n"
# format all other columns
time_all="$time_all$(printf '%12s' "$time") \n"
branch=${branch//1;32m/${branch_style:-1;32}m}
branch=${branch//1;36m/${head_style:-1;36}m}
branch=${branch//1;33m/${tag_style:-1;33}m}
branch_all="$branch_all$(printf '%15s' "$branch")\n"
message_all="$message_all$message\n"
done < <(cd "${1:-"$PWD"}" && git log --all --graph --decorate=short --color --pretty=format:'+%C(bold 214)%<(7,trunc)%h%C(reset)+%C(dim white)%>(12,trunc)%cr%C(reset)+%C(auto)%>(15,trunc)%D%C(reset)+%C(white)%s%C(reset)' && echo);
# paste the columns together and show the tablelike output
paste -d' ' <(echo -e "$time_all") <(echo -e "$branch_all") <(echo -e "$graph_all") <(echo -e "$hash_all") <(echo -e "$message_all")
3) như một bí danh git :
Có lẽ cách thoải mái nhất là thêm bí danh git trong .gitconfig của bạn
[color "decorate"]
HEAD = bold blink italic 196
branch = 214
tag = bold 222
[alias]
count-log = log --all --graph --pretty=format:' '
tably-log = log --all --graph --decorate=short --color --pretty=format:'+%C(bold 214)%<(7,trunc)%h%C(reset)+%C(dim white)%>(12,trunc)%cr%C(reset)+%C(auto)%>(15,trunc)%D%C(reset)+%C(white)%s%C(reset)'
tably = !bash -c '" \
while IFS=+ read -r graph;do \
chars_count=$(sed -nl1000 \"l\" <<< \"$graph\" | grep -Eo \"\\\\\\\\\\\\\\\\|\\||\\/|\\ |\\*|_\" | wc -l); \
[[ $chars_count -gt ${max_chars:-0} ]] && max_chars=$chars_count; \
done < <(git count-log && echo); \
while IFS=+ read -r graph hash time branch message;do \
chars=$(sed -nl1000 \"l\" <<< \"$graph\" | grep -Eo \"\\\\\\\\\\\\\\\\|\\||\\/|\\ |\\*|_\" | wc -l); \
whitespaces=$(($max_chars-$chars)); \
whitespaces=$(seq -s\" \" $whitespaces|tr -d \"[:digit:]\"); \
graph_all=\"$graph_all$graph$whitespaces\n\"; \
hash_all=\"$hash_all$(printf \"%7s\" \"$hash\") \n\"; \
time_all=\"$time_all$(printf \"%12s\" \"$time\") \n\"; \
branch_all=\"$branch_all$(printf \"%15s\" \"$branch\")\n\"; \
message_all=\"$message_all$message\n\"; \
done < <(git tably-log && echo); \
paste -d\" \" <(echo -e \"$time_all\") <(echo -e \"$branch_all\") <(echo -e \"$graph_all\") \
<(echo -e \"$hash_all\") <(echo -e \"$message_all\"); \
'"
Hơn chỉ gọi git tably
theo bất kỳ con đường dự án.
Git mạnh đến mức bạn có thể thay đổi đầu, thẻ, ... trực tiếp như được hiển thị ở trên và được lấy từ đây .
Một tùy chọn ưa thích khác là chọn màu cây bạn thích nhất với
[log]
graphColors = bold 160, blink 231 bold 239, bold 166, bold black 214, bold green, bold 24, cyan
điều đó mang lại cho bạn vẻ ngoài điên rồ nhưng luôn luôn xuất hiện git log
Nháy mắt quá nhiều! Chỉ để chứng minh những gì có thể. Quá ít màu sắc được chỉ định dẫn đến sự lặp lại màu sắc.
Một tham chiếu .gitconfig hoàn chỉnh chỉ là một cú nhấp chuột.
MỘT LẦN NỮA: Hãy vui vẻ để tạo kiểu đầu ra rõ ràng giống như bàn của bạn theo nhu cầu của bạn.
một số bí danh trong ~ / .oh-my-zsh / plugins / git / git.plugin.zsh
gke='\gitk --all $(git log -g --pretty=%h)'
glg='git log --stat'
glgg='git log --graph'
glgga='git log --graph --decorate --all'
glgm='git log --graph --max-count=10'
glgp='git log --stat -p'
glo='git log --oneline --decorate'
glog='git log --oneline --decorate --graph'
gloga='git log --oneline --decorate --graph --all'
glol='git log --graph --pretty='\''%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'\'' --abbrev-commit'
glola='git log --graph --pretty='\''%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'\'' --abbrev-commit --all'
Đối với người dùng OSX, tôi đã lấy ví dụ @gospes và sửa đổi một chút cho gsed ( gnu-sed
được cài đặt qua homebrew) và điều chỉnh màu sắc (để hoạt động với nền đen, không chắc ví dụ ban đầu có thể hiển thị như thế nào trong ví dụ vì nó chỉ định văn bản màu đen trên thiết bị đầu cuối có nền màu đen).
[alias]
# tree, vtree, stree support
logx = log --all --graph --decorate=short --color --format=format:'%C(bold blue)%h%C(reset)+%C(bold black)(%cr)%C(reset)+%C(auto)%d%C(reset)++\n+++ %C(bold black)%an%C(reset)%C(bold black): %s%C(reset)'
tree = log --all --graph --decorate=short --color --format=format:'%C(bold blue)%h%C(reset) %C(auto)%d%C(reset)\n %C(bold black)[%cr]%C(reset) %x09%C(bold black)%an: %s %C(reset)'
stree = !bash -c '" \
while IFS=+ read -r hash time branch message; do \
timelength=$(echo \"$time\" | gsed -r \"s:[^ ][[]([0-9]{1,2}(;[0-9]{1,2})?)?m::g\"); \
timelength=$(echo \"16+${#time}-${#timelength}\" | bc); \
printf \"%${timelength}s %s %s %s\n\" \"$time\" \"$hash\" \"$branch\" \"\"; \
done < <(git logx && echo);"' | less -r
vtree = !bash -c '" \
while IFS=+ read -r hash time branch message; do \
timelength=$(echo \"$time\" | gsed -r \"s:[^ ][[]([0-9]{1,2}(;[0-9]{1,2})?)?m::g\"); \
timelength=$(echo \"16+${#time}-${#timelength}\" | bc); \
printf \"%${timelength}s %s %s %s\n\" \"$time\" \"$hash\" \"$branch\" \"$message\"; \
done < <(git logx && echo);"' | less -r
Chìa khóa cho OSX là trước tiên cài đặt gnu sed (có tùy chọn -r). Dễ dàng thực hiện nhất với homebrew, nó sẽ không ghi đè lên sed được cài đặt hệ thống, mà thay vào đó sẽ cài đặt gnu sed là "gsed". Hy vọng điều này sẽ giúp @ SlippD.Thndry đã nhận xét ở trên về OSX không hoạt động.