2018-10-24


gitlab查看版本

  1. cat /opt/gitlab/embedded/service/gitlab-rails/VERSION

查看gitlab服务状态命令

  1. gitlab-ctl status

启动、停止服务

  1. # 启动Gitlab所有组件
  2. sudo gitlab-ctl start
  3.  
  4. # 停止Gitlab所有组件
  5. sudo gitlab-ctl stop
  6.  
  7. # 重启Gitlab所有组件
  8. sudo gitlab-ctl restart

备份与恢复

备份配置

配置文件再/etc/gitlab/ 下面,将所有的配置用tar备份即可

  1. [root@localhost init.d]# cd /etc/gitlab/
  2. [root@localhost gitlab]# ls
  3. gitlab.rb gitlab-secrets.json trusted-certs

备份数据

Gitlab的备份目录路径设置

  1. [root@code-server ~]# vim /etc/gitlab/gitlab.rb
  2. gitlab_rails['manage_backup_path'] = true
  3. gitlab_rails['backup_path'] = "/data/gitlab/backups" //gitlab备份目录
  4. gitlab_rails[ //生成的备份文件权限
  5. gitlab_rails[ //备份保留天数为3个月(即90天,这里是7776000秒)
  6.  
  7. [root@code-server ~]# mkdir -p /data/gitlab/backups
  8. [root@code-server ~]# chown -R git.git /data/gitlab/backups
  9. [root@code-server ~]# chmod -R /data/gitlab/backups
  10.  
  11. 如上设置了gitlab备份目录路径为/data/gitlab/backups,最后使用下面命令重载gitlab配置文件,是上述修改生效!
  12. root@code-server ~]# gitlab-ctl reconfigure

GItlab备份操作(使用备份命令"gitlab-rake gitlab:backup:create")

  1. 手动备份gitlab
  2. [root@code-server backups]# gitlab-rake gitlab:backup:create
  3. Dumping database ...
  4. Dumping PostgreSQL database gitlabhq_production ... [DONE]
  5. done
  6. Dumping repositories ...
  7. * treesign/treesign ... [DONE]
  8. * gateway/gateway ... [DONE]
  9. * treesign/treesign-doc ... [SKIPPED]
  10. * qwsign/qwsign ... [DONE]
  11. * qwsign/qwsign-doc ... [DONE]
  12. * test/test ... [DONE]
  13. done
  14. Dumping uploads ...
  15. done
  16. Dumping builds ...
  17. done
  18. Dumping artifacts ...
  19. done
  20. Dumping pages ...
  21. done
  22. Dumping lfs objects ...
  23. done
  24. Dumping container registry images ...
  25. [DISABLED]
  26. Creating backup archive: 1510471890_2017_11_12_9..5_gitlab_backup.tar ... done
  27. Uploading backup archive to remote storage ... skipped
  28. Deleting tmp directories ... done
  29. done
  30. done
  31. done
  32. done
  33. done
  34. done
  35. done
  36. Deleting old backups ... done. ( removed)
  37.  
  38. 然后查看下备份文件(文件权限是设定好的644
  39. [root@code-server backups]# ll
  40. total
  41. -rw-r--r-- git git Nov : 1510472027_2017_11_12_9..5_gitlab_backup.tar
  42.  
  43. 编写备份脚本,结合crontab实施自动定时备份,比如每天0点、6点、12点、18点各备份一次
  44. [root@code-server backups]# pwd
  45. /data/gitlab/backups
  46. [root@code-server backups]# vim gitlab_backup.sh
  47. #!/bin/bash
  48. /usr/bin/gitlab-rake gitlab:backup:create CRON=
  49.  
  50. 注意:环境变量CRON=1的作用是如果没有任何错误发生时, 抑制备份脚本的所有进度输出
  51.  
  52. [root@code-server backups]# crontab -l
  53. ,,, * * * /bin/bash -x /data/gitlab/backups/gitlab_backup.sh > /dev/>&

3)Gitlab恢复操作

  1. GItlab只能还原到与备份文件相同的gitlab版本。
  2. 假设在上面gitlab备份之前创建了test项目,然后不小心误删了test项目,现在就进行gitlab恢复操作:
  3.  
  4. )停止相关数据连接服务
  5. [root@code-server backups]# gitlab-ctl stop unicorn
  6. ok: down: unicorn: 0s, normally up
  7. [root@code-server backups]# gitlab-ctl stop sidekiq
  8. ok: down: sidekiq: 1s, normally up
  9. [root@code-server backups]# gitlab-ctl status
  10. run: gitaly: (pid ) 1883s; run: log: (pid ) 163003s
  11. run: gitlab-monitor: (pid ) 1883s; run: log: (pid ) 163002s
  12. run: gitlab-workhorse: (pid ) 1882s; run: log: (pid ) 163002s
  13. run: logrotate: (pid ) 1882s; run: log: (pid ) 160832s
  14. run: nginx: (pid ) 1881s; run: log: (pid ) 163002s
  15. run: node-exporter: (pid ) 1881s; run: log: (pid ) 163002s
  16. run: postgres-exporter: (pid ) 1881s; run: log: (pid ) 163003s
  17. run: postgresql: (pid ) 1880s; run: log: (pid ) 163002s
  18. run: prometheus: (pid ) 1880s; run: log: (pid ) 163002s
  19. run: redis: (pid ) 1879s; run: log: (pid ) 163002s
  20. run: redis-exporter: (pid ) 1879s; run: log: (pid ) 163003s
  21. down: sidekiq: 8s, normally up; run: log: (pid ) 163001s
  22. down: unicorn: 21s, normally up; run: log: (pid ) 163001s
  23.  
  24. )现在通过之前的备份文件进行恢复(必须要备份文件放到备份路径下,这里备份路径我自定义的/data/gitlab/backups,默认的是/var/opt/gitlab/backups
  25. [root@code-server backups]# pwd
  26. /data/gitlab/backups
  27. [root@code-server backups]# ll
  28. total
  29. -rw-r--r-- git git Nov : 1510472027_2017_11_12_9..5_gitlab_backup.tar
  30.  
  31. Gitlab的恢复操作会先将当前所有的数据清空,然后再根据备份数据进行恢复
  32. [root@code-server backups]# gitlab-rake gitlab:backup:restore BACKUP=1510472027_2017_11_12_9.4.5
  33. Unpacking backup ... done
  34. Before restoring the database we recommend removing all existing
  35. tables to avoid future upgrade problems. Be aware that if you have
  36. custom tables in the GitLab database these tables and all data will be
  37. removed.
  38.  
  39. Do you want to continue (yes/no)?
  40. ........
  41. ALTER TABLE
  42. ALTER TABLE
  43. ALTER TABLE
  44. ALTER TABLE
  45. WARNING: no privileges were granted for "public"
  46. GRANT
  47. [DONE]
  48. done
  49. Restoring repositories ...
  50. * treesign/treesign ... [DONE]
  51. * gateway/gateway ... [DONE]
  52. * treesign/treesign-doc ... [DONE]
  53. * qwsign/qwsign ... [DONE]
  54. * qwsign/qwsign-doc ... [DONE]
  55. * test/test ... [DONE]
  56. Put GitLab hooks in repositories dirs [DONE]
  57. done
  58. Restoring uploads ...
  59. done
  60. Restoring builds ...
  61. done
  62. Restoring artifacts ...
  63. done
  64. Restoring pages ...
  65. done
  66. Restoring lfs objects ...
  67. done
  68. This will rebuild an authorized_keys file.
  69. You will lose any data stored in authorized_keys file.
  70. Do you want to continue (yes/no)? yes
  71.  
  72. Deleting tmp directories ... done
  73. done
  74. done
  75. done
  76. done
  77. done
  78. done
  79. done
  80. [root@code-server backups]#
  81.  
  82. 最后再次启动Gitlab
  83. [root@code-server backups]# gitlab-ctl start
  84. ok: run: gitaly: (pid ) 2138s
  85. ok: run: gitlab-monitor: (pid ) 2138s
  86. ok: run: gitlab-workhorse: (pid ) 2137s
  87. ok: run: logrotate: (pid ) 2137s
  88. ok: run: nginx: (pid ) 2136s
  89. ok: run: node-exporter: (pid ) 2136s
  90. ok: run: postgres-exporter: (pid ) 2136s
  91. ok: run: postgresql: (pid ) 2135s
  92. ok: run: prometheus: (pid ) 2135s
  93. ok: run: redis: (pid ) 2134s
  94. ok: run: redis-exporter: (pid ) 2134s
  95. ok: run: sidekiq: (pid ) 0s
  96. ok: run: unicorn: (pid ) 1s
  97. [root@code-server backups]# gitlab-ctl status
  98. run: gitaly: (pid ) 2142s; run: log: (pid ) 163262s
  99. run: gitlab-monitor: (pid ) 2142s; run: log: (pid ) 163261s
  100. run: gitlab-workhorse: (pid ) 2141s; run: log: (pid ) 163261s
  101. run: logrotate: (pid ) 2141s; run: log: (pid ) 161091s
  102. run: nginx: (pid ) 2140s; run: log: (pid ) 163261s
  103. run: node-exporter: (pid ) 2140s; run: log: (pid ) 163261s
  104. run: postgres-exporter: (pid ) 2140s; run: log: (pid ) 163262s
  105. run: postgresql: (pid ) 2139s; run: log: (pid ) 163261s
  106. run: prometheus: (pid ) 2139s; run: log: (pid ) 163261s
  107. run: redis: (pid ) 2138s; run: log: (pid ) 163261s
  108. run: redis-exporter: (pid ) 2138s; run: log: (pid ) 163262s
  109. run: sidekiq: (pid ) 4s; run: log: (pid ) 163260s
  110. run: unicorn: (pid ) 4s; run: log: (pid ) 163260s
  111.  
  112. 恢复命令完成后,可以check检查一下恢复情况
  113. [root@code-server backups]# gitlab-rake gitlab:check SANITIZE=true
  114. Checking GitLab Shell ...
  115.  
  116. GitLab Shell version >= ? ... OK ()
  117. Repo base directory exists?
  118. default... yes
  119. Repo storage directories are symlinks?
  120. default... no
  121. Repo paths owned by git:root, or git:git?
  122. default... yes
  123. Repo paths access is drwxrws---?
  124. default... yes
  125. hooks directories in repos are links: ...
  126. / ... ok
  127. / ... ok
  128. / ... repository is empty
  129. / ... ok
  130. / ... ok
  131. Running /opt/gitlab/embedded/service/gitlab-shell/bin/check
  132. Check GitLab API access: OK
  133. Access to /var/opt/gitlab/.ssh/authorized_keys: OK
  134. Send ping to redis server: OK
  135. gitlab-shell self-check successful
  136.  
  137. Checking GitLab Shell ... Finished
  138.  
  139. Checking Sidekiq ...
  140.  
  141. Running? ... yes
  142. Number of Sidekiq processes ...
  143.  
  144. Checking Sidekiq ... Finished
  145.  
  146. Checking Reply by email ...
  147.  
  148. Reply by email is disabled in config/gitlab.yml
  149.  
  150. Checking Reply by email ... Finished
  151.  
  152. Checking LDAP ...
  153.  
  154. LDAP is disabled in config/gitlab.yml
  155.  
  156. Checking LDAP ... Finished
  157.  
  158. Checking GitLab ...
  159.  
  160. Git configured correctly? ... yes
  161. Database config exists? ... yes
  162. All migrations up? ... yes
  163. Database contains orphaned GroupMembers? ... no
  164. GitLab config exists? ... yes
  165. GitLab config up to date? ... yes
  166. Log directory writable? ... yes
  167. Tmp directory writable? ... yes
  168. Uploads directory exists? ... yes
  169. Uploads directory has correct permissions? ... yes
  170. Uploads directory tmp has correct permissions? ... yes
  171. Init script exists? ... skipped (omnibus-gitlab has no init script)
  172. Init script up-to-date? ... skipped (omnibus-gitlab has no init script)
  173. Projects have namespace: ...
  174. / ... yes
  175. / ... yes
  176. / ... yes
  177. / ... yes
  178. / ... yes
  179. Redis version >= ? ... yes
  180. Ruby version >= ? ... yes ()
  181. Git version >= ? ... yes ()
  182. Active users: ...
  183.  
  184. Checking GitLab ... Finished
  185.  
  186. 然后稍等一会(如果启动gitlab后,访问出现500,这是因为redis等程序还没完全启动,等一会儿访问就ok了),再次登录Gitlab,就会发现之前误删除的test项目已经恢复了!
  187.  
  188. 另外:Gitlab迁移与恢复一样,但是要求两个GitLab版本号一致
GItlab只能还原到与备份文件相同的gitlab版本。
假设在上面gitlab备份之前创建了test项目,然后不小心误删了test项目,现在就进行gitlab恢复操作:
  
1)停止相关数据连接服务
[root@code-server backups]# gitlab-ctl stop unicorn
ok: down: unicorn: 0s, normally up
[root@code-server backups]# gitlab-ctl stop sidekiq
ok: down: sidekiq: 1s, normally up
[root@code-server backups]# gitlab-ctl status
run: gitaly: (pid 98087) 1883s; run: log: (pid 194202) 163003s
run: gitlab-monitor: (pid 98101) 1883s; run: log: (pid 194363) 163002s
run: gitlab-workhorse: (pid 98104) 1882s; run: log: (pid 194362) 163002s
run: logrotate: (pid 98117) 1882s; run: log: (pid 5793) 160832s
run: nginx: (pid 98123) 1881s; run: log: (pid 194359) 163002s
run: node-exporter: (pid 98167) 1881s; run: log: (pid 194360) 163002s
run: postgres-exporter: (pid 98173) 1881s; run: log: (pid 194204) 163003s
run: postgresql: (pid 98179) 1880s; run: log: (pid 194365) 163002s
run: prometheus: (pid 98187) 1880s; run: log: (pid 194364) 163002s
run: redis: (pid 98230) 1879s; run: log: (pid 194358) 163002s
run: redis-exporter: (pid 98234) 1879s; run: log: (pid 194208) 163003s
down: sidekiq: 8s, normally up; run: log: (pid 194437) 163001s
down: unicorn: 21s, normally up; run: log: (pid 194443) 163001s
  
2)现在通过之前的备份文件进行恢复(必须要备份文件放到备份路径下,这里备份路径我自定义的/data/gitlab/backups,默认的是/var/opt/gitlab/backups
[root@code-server backups]# pwd
/data/gitlab/backups
[root@code-server backups]# ll
total 244
-rw-r--r-- 1 git git 245760 Nov 12 15:33 1510472027_2017_11_12_9.4.5_gitlab_backup.tar
  
Gitlab的恢复操作会先将当前所有的数据清空,然后再根据备份数据进行恢复
[root@code-server backups]# gitlab-rake gitlab:backup:restore BACKUP=1510472027_2017_11_12_9.4.5
Unpacking backup ... done
Before restoring the database we recommend removing all existing
tables to avoid future upgrade problems. Be aware that if you have
custom tables in the GitLab database these tables and all data will be
removed.
  
Do you want to continue (yes/no)?
........
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
WARNING:  no privileges were granted for "public"
GRANT
[DONE]
done
Restoring repositories ...
 * treesign/treesign ... [DONE]
 * gateway/gateway ... [DONE]
 * treesign/treesign-doc ... [DONE]
 * qwsign/qwsign ... [DONE]
 * qwsign/qwsign-doc ... [DONE]
 test/test ... [DONE]
Put GitLab hooks in repositories dirs [DONE]
done
Restoring uploads ...
done
Restoring builds ...
done
Restoring artifacts ...
done
Restoring pages ...
done
Restoring lfs objects ...
done
This will rebuild an authorized_keys file.
You will lose any data stored in authorized_keys file.
Do you want to continue (yes/no)? yes
  
  
Deleting tmp directories ... done
done
done
done
done
done
done
done
[root@code-server backups]#
  
最后再次启动Gitlab
[root@code-server backups]# gitlab-ctl start
ok: run: gitaly: (pid 98087) 2138s
ok: run: gitlab-monitor: (pid 98101) 2138s
ok: run: gitlab-workhorse: (pid 98104) 2137s
ok: run: logrotate: (pid 98117) 2137s
ok: run: nginx: (pid 98123) 2136s
ok: run: node-exporter: (pid 98167) 2136s
ok: run: postgres-exporter: (pid 98173) 2136s
ok: run: postgresql: (pid 98179) 2135s
ok: run: prometheus: (pid 98187) 2135s
ok: run: redis: (pid 98230) 2134s
ok: run: redis-exporter: (pid 98234) 2134s
ok: run: sidekiq: (pid 104494) 0s
ok: run: unicorn: (pid 104497) 1s
[root@code-server backups]# gitlab-ctl status
run: gitaly: (pid 98087) 2142s; run: log: (pid 194202) 163262s
run: gitlab-monitor: (pid 98101) 2142s; run: log: (pid 194363) 163261s
run: gitlab-workhorse: (pid 98104) 2141s; run: log: (pid 194362) 163261s
run: logrotate: (pid 98117) 2141s; run: log: (pid 5793) 161091s
run: nginx: (pid 98123) 2140s; run: log: (pid 194359) 163261s
run: node-exporter: (pid 98167) 2140s; run: log: (pid 194360) 163261s
run: postgres-exporter: (pid 98173) 2140s; run: log: (pid 194204) 163262s
run: postgresql: (pid 98179) 2139s; run: log: (pid 194365) 163261s
run: prometheus: (pid 98187) 2139s; run: log: (pid 194364) 163261s
run: redis: (pid 98230) 2138s; run: log: (pid 194358) 163261s
run: redis-exporter: (pid 98234) 2138s; run: log: (pid 194208) 163262s
run: sidekiq: (pid 104494) 4s; run: log: (pid 194437) 163260s
run: unicorn: (pid 104497) 4s; run: log: (pid 194443) 163260s
 
恢复命令完成后,可以check检查一下恢复情况
[root@code-server backups]# gitlab-rake gitlab:check SANITIZE=true
Checking GitLab Shell ...
 
GitLab Shell version >= 5.3.1 ? ... OK (5.3.1)
Repo base directory exists?
default... yes
Repo storage directories are symlinks?
default... no
Repo paths owned by git:root, or git:git?
default... yes
Repo paths access is drwxrws---?
default... yes
hooks directories in repos are links: ...
5/1 ... ok
6/2 ... ok
5/3 ... repository is empty
12/4 ... ok
12/5 ... ok
Running /opt/gitlab/embedded/service/gitlab-shell/bin/check
Check GitLab API access: OK
Access to /var/opt/gitlab/.ssh/authorized_keys: OK
Send ping to redis server: OK
gitlab-shell self-check successful
 
Checking GitLab Shell ... Finished
 
Checking Sidekiq ...
 
Running? ... yes
Number of Sidekiq processes ... 1
 
Checking Sidekiq ... Finished
 
Checking Reply by email ...
 
Reply by email is disabled in config/gitlab.yml
 
Checking Reply by email ... Finished
 
Checking LDAP ...
 
LDAP is disabled in config/gitlab.yml
 
Checking LDAP ... Finished
 
Checking GitLab ...
 
Git configured correctly? ... yes
Database config exists? ... yes
All migrations up? ... yes
Database contains orphaned GroupMembers? ... no
GitLab config exists? ... yes
GitLab config up to date? ... yes
Log directory writable? ... yes
Tmp directory writable? ... yes
Uploads directory exists? ... yes
Uploads directory has correct permissions? ... yes
Uploads directory tmp has correct permissions? ... yes
Init script exists? ... skipped (omnibus-gitlab has no init script)
Init script up-to-date? ... skipped (omnibus-gitlab has no init script)
Projects have namespace: ...
5/1 ... yes
6/2 ... yes
5/3 ... yes
12/4 ... yes
12/5 ... yes
Redis version >= 2.8.0? ... yes
Ruby version >= 2.3.3 ? ... yes (2.3.3)
Git version >= 2.7.3 ? ... yes (2.13.4)
Active users: ... 11
 
Checking GitLab ... Finished
  
然后稍等一会(如果启动gitlab后,访问出现500,这是因为redis等程序还没完全启动,等一会儿访问就ok了),再次登录Gitlab,就会发现之前误删除的test项目已经恢复了!
  
另外:Gitlab迁移与恢复一样,但是要求两个GitLab版本号一致

gitlab 日常运维命令的更多相关文章

  1. hadoop记录-hadoop集群日常运维命令

    hadoop集群日常运维命令 #1.namenode hadoop namenode -format #格式化,慎用 su hdfs hadoop-daemon.sh start namenode h ...

  2. Docker Swarm 日常运维命令笔记

    之前介绍了Docker管理工具-Swarm部署记录,这里简单总结下Docker Swarm的日常维护命令,以作为平时运维笔记. Swarm作为一个管理Docker集群的工具,首先需要将其部署起来,可以 ...

  3. ogg日常运维命令

    1.查看历史记录.快捷执行历史中的一条命令 GGSCI (11g) 32> h 23: view param exta24: info all25: lag exta.... GGSCI (11 ...

  4. AIX—日常运维命令总结

    1. 查看AIX服务器的物理构造信息,包括服务器网络配置信息 # prtconf # ifconfig -a # lsattr -E -l mem0 :查看系统内存大小 # netstat -in : ...

  5. Jenkins日常运维笔记-重启数据覆盖问题、迁移、基于java代码发版(maven构建)

    之前在公司机房部署了一套jenkins环境,现需要迁移至IDC机房服务器上,迁移过程中记录了一些细节:1)jenkins默认的主目录放在当前用户家目录路径下的.jenkins目录中.如jenkins使 ...

  6. hadoop日常运维与升级总结

    日常运维 升级 问题处理方法 日常运维 进程管理 由于配置文件的更改,需要重启生效, 或者是进程自己因某种致命原因终止, 或者发现进程工作出现异常等情况下,需要进行手动进程的关闭或启动, 或者是增删节 ...

  7. zookeeper 用法和日常运维

    本文以ZooKeeper3.4.3版本的官方指南为基础:http://zookeeper.apache.org/doc/r3.4.3/zookeeperAdmin.html,补充一些作者运维实践中的要 ...

  8. 关于总结一些CentOS7常用的运维命令

    Centos7日常需要用的运维命令 1.删除0字节文件 find-type f -size 0 -exec rm -rf {} \ 2.查看进程 按内存从大到小排列 ps -e   -o " ...

  9. DB2常用运维命令

    DB2是IBM公司推出关系型数据库管理系统.主要应用于银行.医院等大型机构.现今DB2主要包含以下三个系列:DB2 for Linux, UNIX and Windows(LUW) . DB2在Lin ...

随机推荐

  1. oracle获取表和列的备注

    using System;using System.Collections.Generic;using System.Data;using System.Linq;using System.Runti ...

  2. oracle数据库数据类型和约束

    今天为大家分享一下关键数据库里面的数据类型和约束.我们都知道国家要讲法律,干什么事情都要遵守法律,比如小的时候你上学的时候要遵守课堂纪律.不能迟到和早退,同样的我们在数据库中创建一些表.或者查询一些表 ...

  3. Java SimpleDateFormat工具类

    package AnimalDemo; import java.text.ParseException; import java.text.SimpleDateFormat; import java. ...

  4. Entity Framework快速入门--直接修改(简要介绍ObjectContext处理机制)

    在介绍Entity Framework的修改实体到数据库的方法之前呢,我们先简要的介绍一下ObjectContext的处理机制. 1.ObjectContext的处理机制 ObjectContext是 ...

  5. 拉登是我罩的队_第三周_需求改进&原型设计

    需求改进&原型设计 1. 需求&原型改进 1.1硬件部分(1) 硬件部分分为主机和遥控器,分别由两个单片机进行控制.(2) 单片机1:负责显示游戏的界面.使用数码管显示当前得分,使用不 ...

  6. 汉字转拼音类EcanConvertToCh

    /// <summary> /// 汉字转拼音类 /// </summary> public class EcanConvertToCh { //定义拼音区编码数组 priva ...

  7. Microsoft.Office.Interop.Word.DocumentClass.SaveAs 命令失败

    asp.net 常用的生成word功能,代码也是网上常见的,自己本地反复测试过没问题.serves 2003下运行没问题,可是发布到2008上就出错.组件权限已配置,windows目录下temp权限已 ...

  8. c#递归理解

    什么是递归函数? 任何一个方法既可以调用其他方法又可以调用自己,而当这个方法调用自己时,我们就叫它递归函数或者递归方法! 说白了,就是调用自己. 通常递归有两个特点:     1.递归方法一直会调用自 ...

  9. requests利用selenium,代理Ip,云打码,验证码抠图操作 爬取搜狗微信公众号内容

    爬取思路,爬取搜狗微信公众号内容,爬取第一层url时请求太快出现验证码,我这里用的蘑菇云代理,并在程序中我判断什么情况下是否+代理,做到合理运用代理ip.爬取第二层url时验证码出现次数更严重(和第一 ...

  10. 洛谷P4012 深海机器人问题(费用流)

    传送门 图给的好坑……还得倒过来…… 用大佬的图做个示范 我们考虑左图吧 把每一个点向下连边,容量$1$,费用为给出的价值(表示一个机器人可以过去取得标本) 再连一条边,容量$inf$,费用$0$(表 ...