2016-06-20 1 views
1

Недавно я создал ветку release, в которой я объединил все отмеченные коммиты. Цель состоит в том, чтобы переименовать master в develop затем использовать master как release ветви (ГИТ-поток, как)Избегайте елки в Git log --all

Теперь, когда я показываю мой журнал, с git log --all я получаю замечательную елку не очень полезно.

* | e503add 10 days ago 
| * a2948b1 11 days ago 
| |\ 
| * \ b22e247 3 weeks ago 
| |\ \ 
| * \ \ 01f1ebc 4 weeks ago 
| |\ \ \ 
| * \ \ \ 01336c7 4 weeks ago 
| |\ \ \ \ 
| * \ \ \ \ 59f83a8 5 weeks ago 
| |\ \ \ \ \ 
| * \ \ \ \ \ 25a2444 6 weeks ago 
| |\ \ \ \ \ \ 
| * \ \ \ \ \ \ 4271ae9 6 weeks ago 
| |\ \ \ \ \ \ \ 
| * \ \ \ \ \ \ \ ef62400 8 weeks ago 
| |\ \ \ \ \ \ \ \ 
| * \ \ \ \ \ \ \ \ f56aa1e 2 months ago 
| |\ \ \ \ \ \ \ \ \ 
| * \ \ \ \ \ \ \ \ \ 7fdab4a 4 months ago 
| |\ \ \ \ \ \ \ \ \ \ 
| * \ \ \ \ \ \ \ \ \ \ b25d101 4 months ago 
| |\ \ \ \ \ \ \ \ \ \ \ 
| * \ \ \ \ \ \ \ \ \ \ \ 7477021 6 months ago 
| |\ \ \ \ \ \ \ \ \ \ \ \ 
| * \ \ \ \ \ \ \ \ \ \ \ \ 8b166b4 8 months ago 
| |\ \ \ \ \ \ \ \ \ \ \ \ \ 
| * \ \ \ \ \ \ \ \ \ \ \ \ \ 93be56f 9 months ago 
| |\ \ \ \ \ \ \ \ \ \ \ \ \ \ 
| * \ \ \ \ \ \ \ \ \ \ \ \ \ \ 7b28785 1 year, 4 months ago 
| |\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 
| * \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 4aaa409 1 year, 4 months ago 
| |\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 
| * \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 4cab662 1 year, 5 months ago 
| |\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 
| * \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 996564a 1 year, 6 months ago 

Одним из решений является использование git log --date-order вместо стандартного --topo-order. Однако я не могу объяснить, почему я получаю такой журнал.

Я создал ветку релиз с помощью этой оболочки скрипт:

#!/bin/bash 
set -e 
git checkout -b release $first-tag 
for tag in "${tags[@]}" 
do 
    date=$(git show -s --format="%ad" $(git log -n1 --format=%h $tag)) 
    export GIT_AUTHOR_DATE=$date; 
    export GIT_COMMITTER_DATE=$date; 
    git merge -Xtheirs -m $tag $tag 
    git tag --delete $tag 
    git tag -a -m $tag $tag 
done   

Как я могу избежать этого елочку в --topo-order?

ответ

1

--topo-order не ведет себя хорошо с несколькими головами [*]. Если вам нужна хорошая картина, попробуйте использовать ее с определенной веткой вместо --all (release в вашем случае).

[*] Фиксировать должен быть после любой фиксации, к которой он присоединен, поэтому, если какая-то предыдущая фиксация релиза помещается после текущей версии, она приводит к отключению всех ветвей, вызывая дерево.

пример сценария, чтобы воспроизвести проблему, как я вижу это:

#!/bin/sh 

set -e 

git init 
git commit --allow-empty -m init 
git tag init 
for i in $(seq 1 10) 
do 
sleep 1 
git commit --allow-empty -m b$i 
git branch b$i 
git reset --hard init 
done 
for i in $(seq 1 10) 
do 
sleep 1 
git merge --no-edit b$i 
done 
git branch merge1 
git reset --hard init 
for i in $(seq 1 10) 
do 
sleep 1 
git merge --no-edit b$i 
done 
+0

Не могли бы вы дать простой пример вашей '[*]' замечания? Я думаю, это ответ, который я ищу, но я хотел бы воспроизвести его в тестовом репозитории. – nowox

+0

Контур похож: из какой-то базовой версии 'B' шаги должны быть похожими: 1) совершить что-то, 2) создать ветку' b1', 3) сбрасывать на 'B', повторять 1-3 несколько раз, создавая ветки b2, b3 и т. Д. ., 4) сбросить в 'B', 5) слить' b1', 'b2' ..., 6) создать ветвь' merge1', repeat 4,5, 7) создать ветвь 'merge2'. – max630

+0

Что вы подразумеваете под «reset to B»? 'git checkout master; git commit; git checkout -b b1; git reset head ~ 1; мерзавец; git commit'. Это ничего не сделает. – nowox