-
Notifications
You must be signed in to change notification settings - Fork 0
/
git合并多个commit.html
569 lines (422 loc) · 26 KB
/
git合并多个commit.html
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
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=2">
<meta name="theme-color" content="#222">
<meta name="generator" content="Hexo 3.9.0">
<link rel="apple-touch-icon" sizes="180x180" href="/images/icons/logo64.png">
<link rel="icon" type="image/png" sizes="32x32" href="/images/icons/logo32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/images/icons/logo32.png">
<link rel="mask-icon" href="/images/icons/logo200.png" color="#222">
<link rel="stylesheet" href="/css/main.css">
<link rel="stylesheet" href="/lib/font-awesome/css/font-awesome.min.css">
<script id="hexo-configurations">
var NexT = window.NexT || {};
var CONFIG = {
root: '/',
scheme: 'Gemini',
version: '7.4.2',
exturl: false,
sidebar: {"position":"left","display":"post","offset":12,"onmobile":false},
copycode: {"enable":true,"show_result":true,"style":null},
back2top: {"enable":true,"sidebar":false,"scrollpercent":false},
bookmark: {"enable":false,"color":"#222","save":"auto"},
fancybox: false,
mediumzoom: false,
lazyload: false,
pangu: false,
algolia: {
appID: '',
apiKey: '',
indexName: '',
hits: {"per_page":10},
labels: {"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}
},
localsearch: {"enable":false,"trigger":"auto","top_n_per_article":1,"unescape":false,"preload":false},
path: '',
motion: {"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}},
translation: {
copy_button: '复制',
copy_success: '复制成功',
copy_failure: '复制失败'
},
sidebarPadding: 40
};
</script>
<meta name="description" content="前言在项目开发的过程中,我们通常会在一个分支上做许多操作,有时候几次commit就为了完成一个小功能点。功能开发完成后,面对凌乱的commit记录,便诞生了合并多个commit的需求。Git当然也考虑到了这种需求,并对此设计了git rebase这个命令,该命令第一次用起来会感觉很复杂,但其实将Git的注释说明都看完并按照指示操作之后,就会觉得这个命令可太好用啦,接下来我以OSPP项目为例,展示如">
<meta name="keywords" content="GIT,OSPP">
<meta property="og:type" content="article">
<meta property="og:title" content="Git合并多个Commit">
<meta property="og:url" content="http://www.fisheryung.top/git合并多个commit.html">
<meta property="og:site_name" content="Fisher's Blog">
<meta property="og:description" content="前言在项目开发的过程中,我们通常会在一个分支上做许多操作,有时候几次commit就为了完成一个小功能点。功能开发完成后,面对凌乱的commit记录,便诞生了合并多个commit的需求。Git当然也考虑到了这种需求,并对此设计了git rebase这个命令,该命令第一次用起来会感觉很复杂,但其实将Git的注释说明都看完并按照指示操作之后,就会觉得这个命令可太好用啦,接下来我以OSPP项目为例,展示如">
<meta property="og:locale" content="zh-CN">
<meta property="og:image" content="http://www.fisheryung.top/images/ospp/commit_history.png">
<meta property="og:image" content="http://www.fisheryung.top/images/ospp/git_rebase.png">
<meta property="og:image" content="http://www.fisheryung.top/images/ospp/edit_msg.png">
<meta property="og:updated_time" content="2022-07-25T08:40:29.740Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Git合并多个Commit">
<meta name="twitter:description" content="前言在项目开发的过程中,我们通常会在一个分支上做许多操作,有时候几次commit就为了完成一个小功能点。功能开发完成后,面对凌乱的commit记录,便诞生了合并多个commit的需求。Git当然也考虑到了这种需求,并对此设计了git rebase这个命令,该命令第一次用起来会感觉很复杂,但其实将Git的注释说明都看完并按照指示操作之后,就会觉得这个命令可太好用啦,接下来我以OSPP项目为例,展示如">
<meta name="twitter:image" content="http://www.fisheryung.top/images/ospp/commit_history.png">
<link rel="canonical" href="http://www.fisheryung.top/git合并多个commit.html">
<script id="page-configurations">
// https://hexo.io/docs/variables.html
CONFIG.page = {
sidebar: "",
isHome: false,
isPost: true,
isPage: false,
isArchive: false
};
</script>
<title>Git合并多个Commit | Fisher's Blog</title>
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-111555456-1"></script>
<script>
var host = window.location.hostname;
if (host !== "localhost" || !true) {
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-111555456-1');
}
</script>
<noscript>
<style>
.use-motion .brand,
.use-motion .menu-item,
.sidebar-inner,
.use-motion .post-block,
.use-motion .pagination,
.use-motion .comments,
.use-motion .post-header,
.use-motion .post-body,
.use-motion .collection-header { opacity: initial; }
.use-motion .site-title,
.use-motion .site-subtitle {
opacity: initial;
top: initial;
}
.use-motion .logo-line-before i { left: initial; }
.use-motion .logo-line-after i { right: initial; }
</style>
</noscript>
</head>
<body itemscope itemtype="http://schema.org/WebPage">
<div class="container use-motion">
<div class="headband"></div>
<header class="header" itemscope itemtype="http://schema.org/WPHeader">
<div class="header-inner"><div class="site-brand-container">
<div class="site-meta">
<div>
<a href="/" class="brand" rel="start">
<span class="logo-line-before"><i></i></span>
<span class="site-title">Fisher's Blog</span>
<span class="logo-line-after"><i></i></span>
</a>
</div>
<p class="site-subtitle">自由尋覓快樂別人從沒法感受</p>
</div>
<div class="site-nav-toggle">
<div class="toggle" aria-label="切换导航栏">
<span class="toggle-line toggle-line-first"></span>
<span class="toggle-line toggle-line-middle"></span>
<span class="toggle-line toggle-line-last"></span>
</div>
</div>
</div>
<nav class="site-nav">
<ul id="menu" class="menu">
<li class="menu-item menu-item-home">
<a href="/" rel="section"><i class="fa fa-fw fa-home"></i>首页</a>
</li>
<li class="menu-item menu-item-about">
<a href="/about/" rel="section"><i class="fa fa-fw fa-user"></i>关于</a>
</li>
<li class="menu-item menu-item-tags">
<a href="/tags/" rel="section"><i class="fa fa-fw fa-tags"></i>标签</a>
</li>
<li class="menu-item menu-item-archives">
<a href="/archives/" rel="section"><i class="fa fa-fw fa-archive"></i>归档</a>
</li>
</ul>
</nav>
</div>
</header>
<div class="back-to-top">
<i class="fa fa-arrow-up"></i>
<span>0%</span>
</div>
<div class="reading-progress-bar"></div>
<a href="https://github.com/FisherWY" class="github-corner" title="Follow me on GitHub" aria-label="Follow me on GitHub" rel="noopener" target="_blank"><svg width="80" height="80" viewBox="0 0 250 250" aria-hidden="true"><path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path><path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"></path><path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"></path></svg></a>
<main class="main">
<div class="main-inner">
<div class="content-wrap">
<div class="content">
<div class="posts-expand">
<article itemscope itemtype="http://schema.org/Article" class="post-block " lang="zh-CN">
<link itemprop="mainEntityOfPage" href="http://www.fisheryung.top/git合并多个commit.html">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/images/icons/avatar.jpg">
<meta itemprop="name" content="Fisher">
<meta itemprop="description" content="记录学习生活中的点滴">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Fisher's Blog">
</span>
<header class="post-header">
<h1 class="post-title" itemprop="name headline">
Git合并多个Commit
</h1>
<div class="post-meta">
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="fa fa-calendar-o"></i>
</span>
<span class="post-meta-item-text">发表于</span>
<time title="创建时间:2022-07-25 14:36:02 / 修改时间:16:40:29" itemprop="dateCreated datePublished" datetime="2022-07-25T14:36:02+08:00">2022-07-25</time>
</span>
<span id="/git合并多个commit.html" class="post-meta-item leancloud_visitors" data-flag-title="Git合并多个Commit" title="阅读次数">
<span class="post-meta-item-icon">
<i class="fa fa-eye"></i>
</span>
<span class="post-meta-item-text">阅读次数:</span>
<span class="leancloud-visitors-count"></span>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>在项目开发的过程中,我们通常会在一个分支上做许多操作,有时候几次commit就为了完成一个小功能点。功能开发完成后,面对凌乱的commit记录,便诞生了合并多个commit的需求。Git当然也考虑到了这种需求,并对此设计了<code>git rebase</code>这个命令,该命令第一次用起来会感觉很复杂,但其实将Git的注释说明都看完并按照指示操作之后,就会觉得这个命令可太好用啦,接下来我以OSPP项目为例,展示如何合并某两次commit。</p><a id="more"></a>
<h1 id="实操"><a href="#实操" class="headerlink" title="实操"></a>实操</h1><h2 id="暂存工作区"><a href="#暂存工作区" class="headerlink" title="暂存工作区"></a>暂存工作区</h2><p>进行一切操作之前,记得先暂存当前工作区的改动<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git stash -m <span class="string">"xxx"</span></span><br></pre></td></tr></table></figure></p>
<h2 id="分析commit记录"><a href="#分析commit记录" class="headerlink" title="分析commit记录"></a>分析commit记录</h2><p>首先是要分析commit记录,判断哪几次commit是需要合并的。如下图所示,在我参与的OSPP项目中,我对<code>tests</code>测试用例文件有着两次commit记录,我需要将这两次commit记录合并为一个。那么,接下来需要做的事情是获得一个<strong>“基础坐标”</strong>,这个坐标通常是要合并的所有commits更前一次commit,其代表的意思是:我要以此commit为起点,修改后面提交的commit。在本次操作中,这个坐标便是<code>cpu/arm: implement cpu compare function ...</code>,获取这个commit的SHA值并复制。</p>
<p><img src="images/ospp/commit_history.png" alt="Commit记录图"></p>
<h2 id="rebase开启时光穿梭"><a href="#rebase开启时光穿梭" class="headerlink" title="rebase开启时光穿梭"></a>rebase开启时光穿梭</h2><p>在上一步中,我们获得了基础坐标的SHA值,接下来使用以下命令,让仓库暂时性地“穿梭”回基础坐标的那一次提交:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git rebase -i fda427e2e50086248244c57e005484616bfc60b1</span><br></pre></td></tr></table></figure></p>
<p>此时终端会打开一个文本编辑器,如下图所示,仔细观察可以看到以下几点现象:</p>
<ol>
<li>目前,我们已经穿梭回基础坐标这一次commit上</li>
<li>我们可以看到前三行是“未来”的几次提交,每一行每个字段对应的意思是: Git操作、SHA、Commit message</li>
<li>看下面的注释,我们有几种操作可以做,默认是<code>pick</code>操作,也就是原封不动提交回去</li>
<li>要达到合并的目的,我们使用<code>squash</code>操作,根据注释的意思,标记了<code>squash</code>的commit记录会合并到前一个<code>pick</code>的提交中</li>
</ol>
<p><img src="images/ospp/git_rebase.png" alt="Rebase命令效果"></p>
<p>根据我的需求,我需要将上图中第二行的提交合并到第一行的提交中。因此,我的操作就是将第二行的<code>pick</code>改为<code>squash</code>,然后保存退出。</p>
<h2 id="修改commit信息"><a href="#修改commit信息" class="headerlink" title="修改commit信息"></a>修改commit信息</h2><p>在上一步保存退出后,终端会打开第二个文本编辑器,第二个文本编辑器的功能是修改commit信息。在这一步我们需要将两次commit的信息合并起来,如下图所示,由于我第二次commit仅仅是修复一个本不该出现的bug,因此我不打算修改第一次commit的信息,只需要将第二次commit的信息注释掉即可。</p>
<p><img src="images/ospp/edit_msg.png" alt="Commit信息修改"></p>
<p>修改完成后保存并退出,Git会自动处理剩余的提交,然后重新回到HEAD commit中。</p>
<p>至此,rebase时光穿梭之旅已经结束,再次查看commit log,可以发现改为<code>squash</code>操作的那一次commit已经不见了,因为这一次commit已经被合并了。</p>
<h2 id="推送分支"><a href="#推送分支" class="headerlink" title="推送分支"></a>推送分支</h2><p>相同的操作将所有要合并的commit都合并完之后,便可以将当前分支推送到远程分支上:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git push origin xxx</span><br></pre></td></tr></table></figure></p>
<p>如果之前已经推送过,则会出现提交记录不一致的情况,再三确认本地分支的修改正确无误后,可以将其强制推送到远程分支上:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git push -f origin xxx</span><br></pre></td></tr></table></figure></p>
<h1 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h1><p>合并commit的操作大致可以总结为以下几个步骤:</p>
<ol>
<li>分析需要合并的commit,确定rebase的基础坐标</li>
<li>使用rebase命令穿梭到基础坐标,修改要合并commit的操作类型</li>
<li>修改commit信息(可能需要解决冲突)</li>
</ol>
<p>Git真厉害!在此推荐个VSCode插件<code>GITLENS</code>,超级厉害!</p>
</div>
<footer class="post-footer">
<div class="post-tags">
<a href="/tags/git/" rel="tag"># GIT</a>
<a href="/tags/ospp/" rel="tag"># OSPP</a>
</div>
<div class="post-nav">
<div class="post-nav-next post-nav-item">
<a href="/ospp之旅(四).html" rel="next" title="OSPP之旅(四)">
<i class="fa fa-chevron-left"></i> OSPP之旅(四)
</a>
</div>
<span class="post-nav-divider"></span>
<div class="post-nav-prev post-nav-item">
<a href="/为没有80、443端口的域名申请ssl证书.html" rel="prev" title="为没有80、443端口的域名申请SSL证书">
为没有80、443端口的域名申请SSL证书 <i class="fa fa-chevron-right"></i>
</a>
</div>
</div>
</footer>
</article>
</div>
</div>
</div>
<div class="toggle sidebar-toggle">
<span class="toggle-line toggle-line-first"></span>
<span class="toggle-line toggle-line-middle"></span>
<span class="toggle-line toggle-line-last"></span>
</div>
<aside class="sidebar">
<div class="sidebar-inner">
<ul class="sidebar-nav motion-element">
<li class="sidebar-nav-toc">
文章目录
</li>
<li class="sidebar-nav-overview">
站点概览
</li>
</ul>
<!--noindex-->
<div class="post-toc-wrap sidebar-panel">
<div class="post-toc motion-element"><ol class="nav"><li class="nav-item nav-level-1"><a class="nav-link" href="#前言"><span class="nav-number">1.</span> <span class="nav-text">前言</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#实操"><span class="nav-number">2.</span> <span class="nav-text">实操</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#暂存工作区"><span class="nav-number">2.1.</span> <span class="nav-text">暂存工作区</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#分析commit记录"><span class="nav-number">2.2.</span> <span class="nav-text">分析commit记录</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#rebase开启时光穿梭"><span class="nav-number">2.3.</span> <span class="nav-text">rebase开启时光穿梭</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#修改commit信息"><span class="nav-number">2.4.</span> <span class="nav-text">修改commit信息</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#推送分支"><span class="nav-number">2.5.</span> <span class="nav-text">推送分支</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#总结"><span class="nav-number">3.</span> <span class="nav-text">总结</span></a></li></ol></div>
</div>
<!--/noindex-->
<div class="site-overview-wrap sidebar-panel">
<div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
<img class="site-author-image" itemprop="image" alt="Fisher"
src="/images/icons/avatar.jpg">
<p class="site-author-name" itemprop="name">Fisher</p>
<div class="site-description" itemprop="description">记录学习生活中的点滴</div>
</div>
<div class="site-state-wrap motion-element">
<nav class="site-state">
<div class="site-state-item site-state-posts">
<a href="/archives/">
<span class="site-state-item-count">97</span>
<span class="site-state-item-name">日志</span>
</a>
</div>
<div class="site-state-item site-state-tags">
<a href="/tags/">
<span class="site-state-item-count">25</span>
<span class="site-state-item-name">标签</span></a>
</div>
</nav>
</div>
<div class="links-of-author motion-element">
<span class="links-of-author-item">
<a href="https://github.com/FisherWY" title="GitHub → https://github.com/FisherWY" rel="noopener" target="_blank"><i class="fa fa-fw fa-github"></i>GitHub</a>
</span>
<span class="links-of-author-item">
<a href="mailto:[email protected]" title="E-Mail → mailto:[email protected]" rel="noopener" target="_blank"><i class="fa fa-fw fa-envelope"></i>E-Mail</a>
</span>
</div>
</div>
</div>
</aside>
<div id="sidebar-dimmer"></div>
</div>
</main>
<footer class="footer">
<div class="footer-inner">
<div class="beian"><a href="http://beian.miit.gov.cn" rel="noopener" target="_blank">粤ICP备2022017631号-1 </a>
<img src="/images/icons/beian.png" style="display: inline-block;">
</div>
<div class="copyright">
©
<span itemprop="copyrightYear">2023</span>
<span class="with-love">
<i class="fa fa-user"></i>
</span>
<span class="author" itemprop="copyrightHolder">Fisher</span>
</div>
<div class="powered-by">由 <a href="https://hexo.io" class="theme-link" rel="noopener" target="_blank">Hexo</a> 强力驱动 v3.9.0
</div>
<span class="post-meta-divider">|</span>
<div class="theme-info">主题 – <a href="https://theme-next.org" class="theme-link" rel="noopener" target="_blank">NexT.Gemini</a> v7.4.2
</div>
<script>
function leancloudSelector(url) {
return document.getElementById(url).querySelector('.leancloud-visitors-count');
}
if (CONFIG.page.isPost) {
function addCount(Counter) {
var visitors = document.querySelector('.leancloud_visitors');
var url = visitors.getAttribute('id').trim();
var title = visitors.getAttribute('data-flag-title').trim();
Counter('get', `/classes/Counter?where=${JSON.stringify({ url })}`)
.then(response => response.json())
.then(({ results }) => {
if (results.length > 0) {
var counter = results[0];
Counter('put', '/classes/Counter/' + counter.objectId, { time: { '__op': 'Increment', 'amount': 1 } })
.then(response => response.json())
.then(() => {
leancloudSelector(url).innerText = counter.time + 1;
})
.catch(error => {
console.log('Failed to save visitor count', error);
})
} else {
leancloudSelector(url).innerText = 'Counter not initialized! More info at console err msg.';
console.error('ATTENTION! LeanCloud counter has security bug, see how to solve it here: https://github.com/theme-next/hexo-leancloud-counter-security. \n However, you can still use LeanCloud without security, by setting `security` option to `false`.');
}
})
.catch(error => {
console.log('LeanCloud Counter Error', error);
});
}
} else {
function showTime(Counter) {
var visitors = document.querySelectorAll('.leancloud_visitors');
var entries = [...visitors].map(element => {
return element.getAttribute('id').trim();
});
Counter('get', `/classes/Counter?where=${JSON.stringify({ url: { '$in': entries } })}`)
.then(response => response.json())
.then(({ results }) => {
if (results.length === 0) {
document.querySelectorAll('.leancloud_visitors .leancloud-visitors-count').forEach(element => {
element.innerText = 0;
});
return;
}
for (var i = 0; i < results.length; i++) {
var item = results[i];
var url = item.url;
var time = item.time;
leancloudSelector(url).innerText = time;
}
for (var i = 0; i < entries.length; i++) {
var url = entries[i];
var element = leancloudSelector(url);
if (element.innerText == '') {
element.innerText = 0;
}
}
})
.catch(error => {
console.log('LeanCloud Counter Error', error);
});
}
}
fetch('https://app-router.leancloud.cn/2/route?appId=l8bvleb0PFB0er4hTWo3bGL1-gzGzoHsz')
.then(response => response.json())
.then(({ api_server }) => {
var Counter = (method, url, data) => {
return fetch(`https://${api_server}/1.1${url}`, {
method: method,
headers: {
'X-LC-Id': 'l8bvleb0PFB0er4hTWo3bGL1-gzGzoHsz',
'X-LC-Key': 'vOPowrKK83zOB6LhLKYOsGd1',
'Content-Type': 'application/json',
},
body: JSON.stringify(data)
});
};
if (CONFIG.page.isPost) {
const localhost = /http:\/\/(localhost|127.0.0.1|0.0.0.0)/;
if (localhost.test(document.URL)) return;
addCount(Counter);
} else if (document.querySelectorAll('.post-title-link').length >= 1) {
showTime(Counter);
}
});
</script>
</div>
</footer>
</div>
<script src="/lib/anime.min.js"></script>
<script src="/lib/velocity/velocity.min.js"></script>
<script src="/lib/velocity/velocity.ui.min.js"></script>
<script src="/js/utils.js"></script><script src="/js/motion.js"></script>
<script src="/js/schemes/pisces.js"></script>
<script src="/js/next-boot.js"></script>
<script>
(function(){
var bp = document.createElement('script');
var curProtocol = window.location.protocol.split(':')[0];
bp.src = (curProtocol === 'https') ? 'https://zz.bdstatic.com/linksubmit/push.js' : 'http://push.zhanzhang.baidu.com/push.js';
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(bp, s);
})();
</script>
<script src="/live2dw/lib/L2Dwidget.min.js?094cbace49a39548bed64abff5988b05"></script><script>L2Dwidget.init({"pluginRootPath":"live2dw/","pluginJsPath":"lib/","pluginModelPath":"assets/","tagMode":false,"debug":false,"display":{"position":"left","width":175,"height":350},"model":{"jsonPath":"/live2dw/assets/koharu.model.json"},"mobile":{"show":false},"log":false});</script></body>
</html>