Как увидеть связанный коммит для каждой записи в ls-tree output? - PullRequest
0 голосов
/ 05 мая 2019

По сути, я спрашиваю, какую команду git (или цепочку команд) использует сервис, такой как gitlab или github, чтобы показать свое древовидное представление?

Извините, я не очень хорошо разбираюсь в английском, мне трудно сформулировать четкий вопрос. Может быть, это более ясно, если я спрошу, делая.

Скажите, я запускаю эти команды:

 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, чтобы показать его в виде дерева?

1 Ответ

0 голосов
/ 06 мая 2019

ОК, я получил решение:

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

# assuming $COMMIT is a valid commit-ish
for line in $(git ls-tree $COMMIT)
do
    filename=$(echo $line | cut -f 2)
    node=$(echo $line | cut -f 1)
    commit=$(git rev-list --max-count=1 $COMMIT $filename)
    echo -e "$node $commit\t$filename"
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...