如何查看ls-tree输出中每个条目的相关提交?

时间:2019-05-05 14:22:55

标签: git

基本上,我要问的是gitlab或github之类的服务使用什么git命令(或命令链)来显示树状视图?

对不起,我的英语不太好,我很难提出一个清晰的问题。 也许我更愿意这样做。

说,我运行以下命令:

 git init
 echo readme > readme
 git add readme 
 git commit -m 'initial commit'
 echo newfile > newfile
 git add newfile 
 git commit -m 'add newfile'
 echo 'readme line 2' >> readme 
 git add readme 
 git commit -m 'add line2 in readme'
 mkdir directory
 echo 'file within directory' > directory/file
 git add directory/file 
 git commit -m 'add file inside directory'

如果我运行git ls-tree HEAD,我会得到的:

mode   type hash                                     name
------ ---- ---------------------------------------- -----------
040000 tree 1886ff20e666d42f9c4684287bd87c45d4085d1e directory
100644 blob aa39060d7ee7daa8833a5ad2354c3f77d35cac71 newfile
100644 blob 8a19af2f451dc8ba3aa509914210c759a3f7edb7 readme

如果我运行git log --pretty=oneline,我会得到的:

commit hash                              commit message
---------------------------------------- -------------------------
e5791b809dbdc1c140124a822d812171bde9b1d1 add file inside directory
59a96b2dbab42d57ea74379ffb44b7ea97c75185 add line2 in readme
be90159c01a78190d32bc1b452da060d4ed61380 add newfile
2b0030b00a6b9ac56d63d3f1f2e46e7a3c796b4f initial commit

我想要得到的东西是这样的:

mode   type hash                                     name        commit message            commit hash                             
------ ---- ---------------------------------------- ----------- ------------------------- ----------------------------------------
040000 tree 1886ff20e666d42f9c4684287bd87c45d4085d1e directory   add file inside directory e5791b809dbdc1c140124a822d812171bde9b1d1
100644 blob aa39060d7ee7daa8833a5ad2354c3f77d35cac71 newfile     add newfile               be90159c01a78190d32bc1b452da060d4ed61380
100644 blob 8a19af2f451dc8ba3aa509914210c759a3f7edb7 readme      add line2 in readme       59a96b2dbab42d57ea74379ffb44b7ea97c75185

看到了吗?每棵树的节点显示相关的/最后的提交。就像gitlab或github 做。现在,回到我的问题:什么git命令(或命令链)做一个 gitlab或github之类的服务用于显示树状视图?

2 个答案:

答案 0 :(得分:0)

好的,我找到了解决方案:

# dim: batch_size x batch_max_len x embedding_dim

答案 1 :(得分:0)

根据mas-bagol的回答,对于遇到此问题的其他人,以下内容将包含git commit消息:

# makes for loop works line by line
OIFS=$IFS
IFS=$'\n'

# assuming $COMMIT is a valid commit-ish
for line in $(git ls-tree $COMMIT)
do
    filename=$(echo $line | cut -f 2)
    # non filename components, tab separated
    node=$(echo $line | cut -f 1 | tr -s ' ' '\t')
    # Output latest entry, with requested fields tab separated
    log_entry=$(git log --format="%H\t%f" -n 1 -- $COMMIT $filename)
    echo -e "$node\t$log_entry\t$filename"
done

IFS=$OIFS

这将提供以下行的输出:

100644  blob    7bfa463a30fd3c5a1e58cdbd64695e0981eea7e0\
    1506412d4638d3a8d0f9e3ee87e55c1a5d0af582    initial commit  README.md

格式为:

<mode> TAB <type> TAB <object> TAB <commit hash> TAB <commit message> TAB <file>

使用git版本2.24.1测试