This repository has been archived by the owner on Apr 1, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Makefile
173 lines (137 loc) · 7.74 KB
/
Makefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
## Заглушка на вывод сообщений указанными правилами
## (без указания имён подавляет вывод со стороны make-файла у всех правил)
.SILENT :
# Блок правил для разработки и публикации кода на Github
## Имя пользователя на GitHub
username := Paveloom
## Форсировать изменения в текущей версии? (см. Сценарии использования для правил git-dev
## и git-dev-ready; см. действия, выполняемые при значении true, в правиле force-change)
force-changes := true
## Правило для создания и публикации коммита
git :
git add -A
git commit -e
git push
## Правило для обновления последнего коммита до текущего состояния локального репозитория
git-am :
git add -A
git commit --amend
git push --force-with-lease
## Правило для обновления ветки master до текущего состояния ветки dev
## (слияние без создания коммита слияния; способ через создание второстепенной ветки feature)
git-dev :
if [ "true" = "$(force-changes)" ]; then \
git checkout dev; \
make force-change; \
git add -A; \
git commit --amend --no-edit; \
git push --force-with-lease; \
fi
git checkout master
git checkout -b feature
git merge --squash dev -Xtheirs
git commit
git checkout master
git merge feature
git branch -D feature
git push --force-with-lease
git checkout dev
## Правило для обновления ветки dev до текущего состояния ветки master
## (аналогично правилу git-dev, только в обратную сторону; разумно использовать, только
## если были проделаны изменения на ветке master после последнего слияния)
git-dev-ready :
if [ "true" = "$(force-changes)" ]; then \
git checkout master; \
make force-change; \
git add -A; \
git commit --amend --no-edit; \
git push --force-with-lease; \
fi
git checkout dev
git checkout -b dev-upd
git merge --squash master -Xtheirs
git commit
git checkout dev
git merge dev-upd
git branch -D dev-upd
git push --force-with-lease
## Правило для подключения удалённого репозитория с одной веткой и
## загрузки в него стартового make-файла (см. Правила)
ifeq (git-new-2, $(firstword $(MAKECMDGOALS)))
new_rep := $(wordlist 2, 2, $(MAKECMDGOALS))
$(eval $(new_rep):;@#)
endif
git-new :
make git-clean
git init
git remote add origin [email protected]:$(username)/$(new_rep).git
git add Makefile
git commit -m "Стартовый коммит."
git push -u origin master
## Правило для подключения нового удалённого репозитория с двумя ветками и
## загрузки в него стартового make-файла (см. Правила)
ifeq (git-new-2, $(firstword $(MAKECMDGOALS)))
new_rep := $(wordlist 2, 2, $(MAKECMDGOALS))
$(eval $(new_rep):;@#)
endif
git-new-2 :
make git-clean
git init
git remote add origin [email protected]:$(username)/$(new_rep).git
git add Makefile
git commit -m "Стартовый коммит."
git push -u origin master
git checkout -b dev
git push -u origin dev
## Правило для повторения последнего переноса изменений из ветки dev в ветку master
## (используется reset --hard, поэтому следует использовать только при уверенности в
## правильности своих действий — поэтому задаётся вопрос)
git-dev-re :
echo
echo "Будет использован reset --hard. Убедитесь, что последний коммит в ветке master получен переносом изменений из ветки dev."
echo "Скопируйте, если необходимо, сообщение последнего коммита на ветке master:"
echo
git log master -1 --pretty=format:%s; echo
git log master -1 --pretty=format:%b; echo
while [ -z "$$CONTINUE" ]; do \
read -r -p "Продолжить? [y]: " CONTINUE; \
done ; \
[ $$CONTINUE = "y" ] || [ $$CONTINUE = "Y" ] || (echo; echo "Отменено."; echo; exit 1;)
echo
git checkout master
git reset --hard HEAD~1
make git-dev
## Правило для повторения последнего переноса изменений из ветки master в ветку dev
## (используется reset --hard, поэтому следует использовать только при уверенности в
## правильности своих действий — поэтому задаётся вопрос)
git-dev-ready-re :
echo
echo "Будет использован reset --hard. Убедитесь, что последний коммит в ветке dev получен переносом изменений из ветки master."
echo "Скопируйте, если необходимо, сообщение последнего коммита на ветке dev:"
echo
git log dev -1 --pretty=format:%s; echo
git log dev -1 --pretty=format:%b; echo
while [ -z "$$CONTINUE" ]; do \
read -r -p "Продолжить? [y]: " CONTINUE; \
done ; \
[ $$CONTINUE = "y" ] || [ $$CONTINUE = "Y" ] || (echo; echo "Отменено."; echo; exit 1;)
echo
git checkout dev
git reset --hard HEAD~1
make git-dev-ready
## Правило для форсирования изменений (добавляет / удаляет пробелы в последней пустой строке;
## создает пустую строку, если необходимо; использование зависит от переменной force-changes)
force-change :
if tail Makefile -n 1 | grep '[[:alpha:]]'; then \
echo "$f" >> Makefile; \
else \
if tail Makefile -n 1 | grep ' [[:space:]]'; then \
truncate -s-1 Makefile; \
else \
truncate -s-1 Makefile; \
echo "$f " >> Makefile; \
fi \
fi
## Правило для удаления репозитория в текущей директории
git-clean :
rm -rf .git