@fredlackey/devutils 0.0.18 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (447) hide show
  1. package/README.md +214 -141
  2. package/package.json +8 -83
  3. package/src/api/loader.js +229 -0
  4. package/src/api/registry.json +62 -0
  5. package/src/cli.js +293 -60
  6. package/src/commands/ai/index.js +16 -0
  7. package/src/commands/ai/launch.js +112 -0
  8. package/src/commands/ai/list.js +54 -0
  9. package/src/commands/ai/resume.js +70 -0
  10. package/src/commands/ai/sessions.js +121 -0
  11. package/src/commands/ai/set.js +131 -0
  12. package/src/commands/ai/show.js +74 -0
  13. package/src/commands/ai/tools.js +46 -0
  14. package/src/commands/alias/add.js +93 -0
  15. package/src/commands/alias/helpers.js +107 -0
  16. package/src/commands/alias/index.js +14 -0
  17. package/src/commands/alias/list.js +55 -0
  18. package/src/commands/alias/remove.js +62 -0
  19. package/src/commands/alias/sync.js +109 -0
  20. package/src/commands/api/disable.js +73 -0
  21. package/src/commands/api/enable.js +148 -0
  22. package/src/commands/api/index.js +15 -0
  23. package/src/commands/api/list.js +66 -0
  24. package/src/commands/api/update.js +87 -0
  25. package/src/commands/auth/index.js +15 -0
  26. package/src/commands/auth/list.js +49 -0
  27. package/src/commands/auth/login.js +384 -0
  28. package/src/commands/auth/logout.js +111 -0
  29. package/src/commands/auth/refresh.js +184 -0
  30. package/src/commands/auth/services.js +169 -0
  31. package/src/commands/auth/status.js +104 -0
  32. package/src/commands/config/export.js +224 -0
  33. package/src/commands/config/get.js +52 -0
  34. package/src/commands/config/import.js +308 -0
  35. package/src/commands/config/index.js +17 -0
  36. package/src/commands/config/init.js +143 -0
  37. package/src/commands/config/reset.js +57 -0
  38. package/src/commands/config/set.js +93 -0
  39. package/src/commands/config/show.js +35 -0
  40. package/src/commands/help.js +338 -0
  41. package/src/commands/identity/add.js +133 -0
  42. package/src/commands/identity/index.js +17 -0
  43. package/src/commands/identity/link.js +76 -0
  44. package/src/commands/identity/list.js +48 -0
  45. package/src/commands/identity/remove.js +72 -0
  46. package/src/commands/identity/show.js +65 -0
  47. package/src/commands/identity/sync.js +172 -0
  48. package/src/commands/identity/unlink.js +57 -0
  49. package/src/commands/ignore/add.js +165 -0
  50. package/src/commands/ignore/index.js +14 -0
  51. package/src/commands/ignore/list.js +89 -0
  52. package/src/commands/ignore/markers.js +43 -0
  53. package/src/commands/ignore/remove.js +164 -0
  54. package/src/commands/ignore/show.js +169 -0
  55. package/src/commands/machine/detect.js +122 -0
  56. package/src/commands/machine/index.js +14 -0
  57. package/src/commands/machine/list.js +74 -0
  58. package/src/commands/machine/set.js +106 -0
  59. package/src/commands/machine/show.js +35 -0
  60. package/src/commands/schema.js +152 -0
  61. package/src/commands/search/collections.js +134 -0
  62. package/src/commands/search/get.js +71 -0
  63. package/src/commands/search/index-cmd.js +54 -0
  64. package/src/commands/search/index.js +21 -0
  65. package/src/commands/search/keyword.js +60 -0
  66. package/src/commands/search/qmd.js +70 -0
  67. package/src/commands/search/query.js +64 -0
  68. package/src/commands/search/semantic.js +62 -0
  69. package/src/commands/search/status.js +46 -0
  70. package/src/commands/status.js +224 -171
  71. package/src/commands/tools/check.js +79 -0
  72. package/src/commands/tools/index.js +14 -0
  73. package/src/commands/tools/install.js +110 -0
  74. package/src/commands/tools/list.js +91 -0
  75. package/src/commands/tools/search.js +60 -0
  76. package/src/commands/update.js +83 -112
  77. package/src/commands/util/add.js +151 -0
  78. package/src/commands/util/index.js +15 -0
  79. package/src/commands/util/list.js +97 -0
  80. package/src/commands/util/remove.js +76 -0
  81. package/src/commands/util/run.js +79 -0
  82. package/src/commands/util/show.js +67 -0
  83. package/src/commands/version.js +21 -88
  84. package/src/installers/_template.js +104 -0
  85. package/src/installers/git.js +150 -0
  86. package/src/installers/homebrew.js +190 -0
  87. package/src/installers/node.js +223 -0
  88. package/src/installers/registry.json +29 -0
  89. package/src/lib/config.js +125 -0
  90. package/src/lib/detect.js +74 -0
  91. package/src/lib/errors.js +114 -0
  92. package/src/lib/github.js +315 -0
  93. package/src/lib/installer.js +225 -0
  94. package/src/lib/output.js +239 -0
  95. package/src/lib/platform.js +112 -0
  96. package/src/lib/platforms/amazon-linux.js +41 -0
  97. package/src/lib/platforms/gitbash.js +46 -0
  98. package/src/lib/platforms/macos.js +45 -0
  99. package/src/lib/platforms/raspbian.js +41 -0
  100. package/src/lib/platforms/ubuntu.js +39 -0
  101. package/src/lib/platforms/windows.js +45 -0
  102. package/src/lib/prompt.js +161 -0
  103. package/src/lib/schema.js +211 -0
  104. package/src/lib/shell.js +75 -0
  105. package/src/patterns/gitignore/claude-code.txt +25 -0
  106. package/src/patterns/gitignore/docker.txt +15 -0
  107. package/src/patterns/gitignore/go.txt +24 -0
  108. package/src/patterns/gitignore/java.txt +38 -0
  109. package/src/patterns/gitignore/jetbrains.txt +26 -0
  110. package/src/patterns/gitignore/linux.txt +18 -0
  111. package/src/patterns/gitignore/macos.txt +27 -0
  112. package/src/patterns/gitignore/node.txt +51 -0
  113. package/src/patterns/gitignore/python.txt +55 -0
  114. package/src/patterns/gitignore/rust.txt +14 -0
  115. package/src/patterns/gitignore/terraform.txt +30 -0
  116. package/src/patterns/gitignore/vscode.txt +15 -0
  117. package/src/patterns/gitignore/windows.txt +25 -0
  118. package/src/utils/clone/index.js +165 -0
  119. package/src/utils/git-push/index.js +230 -0
  120. package/src/utils/git-status/index.js +116 -0
  121. package/src/utils/git-status/unix.sh +75 -0
  122. package/src/utils/registry.json +41 -0
  123. package/bin/dev.js +0 -16
  124. package/files/README.md +0 -0
  125. package/files/claude/.claude/commands/setup-context.md +0 -3
  126. package/files/monorepos/_archive/README.md +0 -36
  127. package/files/monorepos/_legacy/README.md +0 -36
  128. package/files/monorepos/ai-docs/README.md +0 -33
  129. package/files/monorepos/apps/README.md +0 -24
  130. package/files/monorepos/docs/README.md +0 -40
  131. package/files/monorepos/packages/README.md +0 -25
  132. package/files/monorepos/research/README.md +0 -29
  133. package/files/monorepos/scripts/README.md +0 -24
  134. package/src/commands/README.md +0 -41
  135. package/src/commands/configure.js +0 -199
  136. package/src/commands/identity.js +0 -1630
  137. package/src/commands/ignore.js +0 -247
  138. package/src/commands/install.js +0 -526
  139. package/src/commands/setup.js +0 -246
  140. package/src/completion.js +0 -284
  141. package/src/constants.js +0 -45
  142. package/src/ignore/claude-code.txt +0 -10
  143. package/src/ignore/docker.txt +0 -18
  144. package/src/ignore/linux.txt +0 -23
  145. package/src/ignore/macos.txt +0 -36
  146. package/src/ignore/node.txt +0 -55
  147. package/src/ignore/terraform.txt +0 -37
  148. package/src/ignore/vscode.txt +0 -18
  149. package/src/ignore/windows.txt +0 -35
  150. package/src/index.js +0 -0
  151. package/src/installs/README.md +0 -399
  152. package/src/installs/adobe-creative-cloud.js +0 -546
  153. package/src/installs/adobe-creative-cloud.md +0 -605
  154. package/src/installs/appcleaner.js +0 -321
  155. package/src/installs/appcleaner.md +0 -699
  156. package/src/installs/apt-transport-https.js +0 -390
  157. package/src/installs/apt-transport-https.md +0 -678
  158. package/src/installs/atomicparsley.js +0 -642
  159. package/src/installs/atomicparsley.md +0 -795
  160. package/src/installs/aws-cli.js +0 -797
  161. package/src/installs/aws-cli.md +0 -727
  162. package/src/installs/balena-etcher.js +0 -710
  163. package/src/installs/balena-etcher.md +0 -761
  164. package/src/installs/bambu-studio.js +0 -1143
  165. package/src/installs/bambu-studio.md +0 -780
  166. package/src/installs/bash-completion.js +0 -575
  167. package/src/installs/bash-completion.md +0 -833
  168. package/src/installs/bash.js +0 -417
  169. package/src/installs/bash.md +0 -993
  170. package/src/installs/beyond-compare.js +0 -603
  171. package/src/installs/beyond-compare.md +0 -813
  172. package/src/installs/brave-browser.js +0 -968
  173. package/src/installs/brave-browser.md +0 -650
  174. package/src/installs/build-essential.js +0 -529
  175. package/src/installs/build-essential.md +0 -977
  176. package/src/installs/ca-certificates.js +0 -618
  177. package/src/installs/ca-certificates.md +0 -937
  178. package/src/installs/caffeine.js +0 -508
  179. package/src/installs/caffeine.md +0 -839
  180. package/src/installs/camtasia.js +0 -596
  181. package/src/installs/camtasia.md +0 -762
  182. package/src/installs/chatgpt.js +0 -476
  183. package/src/installs/chatgpt.md +0 -814
  184. package/src/installs/chocolatey.js +0 -456
  185. package/src/installs/chocolatey.md +0 -661
  186. package/src/installs/chrome-canary.js +0 -419
  187. package/src/installs/chrome-canary.md +0 -641
  188. package/src/installs/chromium.js +0 -667
  189. package/src/installs/chromium.md +0 -838
  190. package/src/installs/claude-code.js +0 -576
  191. package/src/installs/claude-code.md +0 -1173
  192. package/src/installs/cloudflare-warp.js +0 -900
  193. package/src/installs/cloudflare-warp.md +0 -1047
  194. package/src/installs/comet-browser.js +0 -588
  195. package/src/installs/comet-browser.md +0 -731
  196. package/src/installs/curl.js +0 -379
  197. package/src/installs/curl.md +0 -714
  198. package/src/installs/cursor.js +0 -579
  199. package/src/installs/cursor.md +0 -970
  200. package/src/installs/dbeaver.js +0 -924
  201. package/src/installs/dbeaver.md +0 -939
  202. package/src/installs/dbschema.js +0 -692
  203. package/src/installs/dbschema.md +0 -925
  204. package/src/installs/dependencies.md +0 -453
  205. package/src/installs/development-tools.js +0 -600
  206. package/src/installs/development-tools.md +0 -977
  207. package/src/installs/docker.js +0 -1029
  208. package/src/installs/docker.md +0 -1109
  209. package/src/installs/drawio.js +0 -1019
  210. package/src/installs/drawio.md +0 -795
  211. package/src/installs/elmedia-player.js +0 -347
  212. package/src/installs/elmedia-player.md +0 -556
  213. package/src/installs/ffmpeg.js +0 -889
  214. package/src/installs/ffmpeg.md +0 -852
  215. package/src/installs/file.js +0 -464
  216. package/src/installs/file.md +0 -987
  217. package/src/installs/gemini-cli.js +0 -811
  218. package/src/installs/gemini-cli.md +0 -1153
  219. package/src/installs/git.js +0 -400
  220. package/src/installs/git.md +0 -907
  221. package/src/installs/gitego.js +0 -949
  222. package/src/installs/gitego.md +0 -1172
  223. package/src/installs/go.js +0 -931
  224. package/src/installs/go.md +0 -958
  225. package/src/installs/google-antigravity.js +0 -913
  226. package/src/installs/google-antigravity.md +0 -1075
  227. package/src/installs/google-chrome.js +0 -833
  228. package/src/installs/google-chrome.md +0 -862
  229. package/src/installs/gpg.js +0 -480
  230. package/src/installs/gpg.md +0 -1056
  231. package/src/installs/homebrew.js +0 -1028
  232. package/src/installs/homebrew.md +0 -988
  233. package/src/installs/imageoptim.js +0 -968
  234. package/src/installs/imageoptim.md +0 -1119
  235. package/src/installs/installers.json +0 -4032
  236. package/src/installs/installers.json.tmp +0 -3953
  237. package/src/installs/jq.js +0 -400
  238. package/src/installs/jq.md +0 -809
  239. package/src/installs/keyboard-maestro.js +0 -719
  240. package/src/installs/keyboard-maestro.md +0 -825
  241. package/src/installs/kiro.js +0 -864
  242. package/src/installs/kiro.md +0 -1015
  243. package/src/installs/latex.js +0 -789
  244. package/src/installs/latex.md +0 -1095
  245. package/src/installs/lftp.js +0 -356
  246. package/src/installs/lftp.md +0 -907
  247. package/src/installs/lsb-release.js +0 -346
  248. package/src/installs/lsb-release.md +0 -814
  249. package/src/installs/messenger.js +0 -847
  250. package/src/installs/messenger.md +0 -900
  251. package/src/installs/microsoft-office.js +0 -568
  252. package/src/installs/microsoft-office.md +0 -760
  253. package/src/installs/microsoft-teams.js +0 -801
  254. package/src/installs/microsoft-teams.md +0 -886
  255. package/src/installs/moom.js +0 -326
  256. package/src/installs/moom.md +0 -570
  257. package/src/installs/node.js +0 -904
  258. package/src/installs/node.md +0 -1153
  259. package/src/installs/nordpass.js +0 -716
  260. package/src/installs/nordpass.md +0 -921
  261. package/src/installs/nordvpn.js +0 -892
  262. package/src/installs/nordvpn.md +0 -1052
  263. package/src/installs/nvm.js +0 -995
  264. package/src/installs/nvm.md +0 -1057
  265. package/src/installs/ohmyzsh.js +0 -529
  266. package/src/installs/ohmyzsh.md +0 -1094
  267. package/src/installs/openssh.js +0 -804
  268. package/src/installs/openssh.md +0 -1056
  269. package/src/installs/pandoc.js +0 -662
  270. package/src/installs/pandoc.md +0 -1036
  271. package/src/installs/parallels-desktop.js +0 -431
  272. package/src/installs/parallels-desktop.md +0 -446
  273. package/src/installs/pinentry.js +0 -510
  274. package/src/installs/pinentry.md +0 -1142
  275. package/src/installs/pngyu.js +0 -869
  276. package/src/installs/pngyu.md +0 -896
  277. package/src/installs/postman.js +0 -799
  278. package/src/installs/postman.md +0 -940
  279. package/src/installs/procps.js +0 -425
  280. package/src/installs/procps.md +0 -851
  281. package/src/installs/safari-tech-preview.js +0 -374
  282. package/src/installs/safari-tech-preview.md +0 -533
  283. package/src/installs/sfnt2woff.js +0 -658
  284. package/src/installs/sfnt2woff.md +0 -795
  285. package/src/installs/shellcheck.js +0 -481
  286. package/src/installs/shellcheck.md +0 -1005
  287. package/src/installs/slack.js +0 -741
  288. package/src/installs/slack.md +0 -865
  289. package/src/installs/snagit.js +0 -585
  290. package/src/installs/snagit.md +0 -844
  291. package/src/installs/software-properties-common.js +0 -372
  292. package/src/installs/software-properties-common.md +0 -805
  293. package/src/installs/spotify.js +0 -877
  294. package/src/installs/spotify.md +0 -901
  295. package/src/installs/studio-3t.js +0 -823
  296. package/src/installs/studio-3t.md +0 -918
  297. package/src/installs/sublime-text.js +0 -804
  298. package/src/installs/sublime-text.md +0 -914
  299. package/src/installs/superwhisper.js +0 -706
  300. package/src/installs/superwhisper.md +0 -630
  301. package/src/installs/tailscale.js +0 -745
  302. package/src/installs/tailscale.md +0 -1100
  303. package/src/installs/tar.js +0 -389
  304. package/src/installs/tar.md +0 -946
  305. package/src/installs/termius.js +0 -798
  306. package/src/installs/termius.md +0 -844
  307. package/src/installs/terraform.js +0 -779
  308. package/src/installs/terraform.md +0 -899
  309. package/src/installs/tfenv.js +0 -778
  310. package/src/installs/tfenv.md +0 -1091
  311. package/src/installs/tidal.js +0 -771
  312. package/src/installs/tidal.md +0 -864
  313. package/src/installs/tmux.js +0 -346
  314. package/src/installs/tmux.md +0 -1030
  315. package/src/installs/tree.js +0 -411
  316. package/src/installs/tree.md +0 -833
  317. package/src/installs/unzip.js +0 -460
  318. package/src/installs/unzip.md +0 -879
  319. package/src/installs/vim.js +0 -421
  320. package/src/installs/vim.md +0 -1040
  321. package/src/installs/vlc.js +0 -821
  322. package/src/installs/vlc.md +0 -927
  323. package/src/installs/vscode.js +0 -843
  324. package/src/installs/vscode.md +0 -1002
  325. package/src/installs/wget.js +0 -420
  326. package/src/installs/wget.md +0 -791
  327. package/src/installs/whatsapp.js +0 -729
  328. package/src/installs/whatsapp.md +0 -854
  329. package/src/installs/winpty.js +0 -352
  330. package/src/installs/winpty.md +0 -620
  331. package/src/installs/woff2.js +0 -553
  332. package/src/installs/woff2.md +0 -977
  333. package/src/installs/wsl.js +0 -572
  334. package/src/installs/wsl.md +0 -699
  335. package/src/installs/xcode-clt.js +0 -520
  336. package/src/installs/xcode-clt.md +0 -351
  337. package/src/installs/xcode.js +0 -560
  338. package/src/installs/xcode.md +0 -573
  339. package/src/installs/yarn.js +0 -824
  340. package/src/installs/yarn.md +0 -1074
  341. package/src/installs/yq.js +0 -654
  342. package/src/installs/yq.md +0 -944
  343. package/src/installs/yt-dlp.js +0 -701
  344. package/src/installs/yt-dlp.md +0 -946
  345. package/src/installs/yum-utils.js +0 -297
  346. package/src/installs/yum-utils.md +0 -648
  347. package/src/installs/zoom.js +0 -759
  348. package/src/installs/zoom.md +0 -884
  349. package/src/installs/zsh.js +0 -455
  350. package/src/installs/zsh.md +0 -1008
  351. package/src/scripts/README.md +0 -617
  352. package/src/scripts/STATUS.md +0 -208
  353. package/src/scripts/afk.js +0 -411
  354. package/src/scripts/backup-all.js +0 -746
  355. package/src/scripts/backup-source.js +0 -727
  356. package/src/scripts/brewd.js +0 -389
  357. package/src/scripts/brewi.js +0 -520
  358. package/src/scripts/brewr.js +0 -527
  359. package/src/scripts/brews.js +0 -477
  360. package/src/scripts/brewu.js +0 -504
  361. package/src/scripts/c.js +0 -201
  362. package/src/scripts/ccurl.js +0 -341
  363. package/src/scripts/certbot-crontab-init.js +0 -504
  364. package/src/scripts/certbot-init.js +0 -657
  365. package/src/scripts/ch.js +0 -355
  366. package/src/scripts/claude-danger.js +0 -268
  367. package/src/scripts/clean-dev.js +0 -435
  368. package/src/scripts/clear-dns-cache.js +0 -541
  369. package/src/scripts/clone.js +0 -435
  370. package/src/scripts/code-all.js +0 -437
  371. package/src/scripts/count-files.js +0 -211
  372. package/src/scripts/count-folders.js +0 -211
  373. package/src/scripts/count.js +0 -264
  374. package/src/scripts/d.js +0 -219
  375. package/src/scripts/datauri.js +0 -389
  376. package/src/scripts/delete-files.js +0 -380
  377. package/src/scripts/docker-clean.js +0 -426
  378. package/src/scripts/dp.js +0 -442
  379. package/src/scripts/e.js +0 -390
  380. package/src/scripts/empty-trash.js +0 -513
  381. package/src/scripts/evm.js +0 -444
  382. package/src/scripts/fetch-github-repos.js +0 -456
  383. package/src/scripts/get-channel.js +0 -345
  384. package/src/scripts/get-course.js +0 -399
  385. package/src/scripts/get-dependencies.js +0 -306
  386. package/src/scripts/get-folder.js +0 -799
  387. package/src/scripts/get-tunes.js +0 -426
  388. package/src/scripts/get-video.js +0 -367
  389. package/src/scripts/git-backup.js +0 -577
  390. package/src/scripts/git-clone.js +0 -493
  391. package/src/scripts/git-pup.js +0 -319
  392. package/src/scripts/git-push.js +0 -396
  393. package/src/scripts/h.js +0 -622
  394. package/src/scripts/hide-desktop-icons.js +0 -499
  395. package/src/scripts/hide-hidden-files.js +0 -538
  396. package/src/scripts/install-dependencies-from.js +0 -456
  397. package/src/scripts/ips.js +0 -663
  398. package/src/scripts/iso.js +0 -370
  399. package/src/scripts/killni.js +0 -577
  400. package/src/scripts/ll.js +0 -467
  401. package/src/scripts/local-ip.js +0 -325
  402. package/src/scripts/m.js +0 -524
  403. package/src/scripts/map.js +0 -309
  404. package/src/scripts/mkd.js +0 -351
  405. package/src/scripts/ncu-update-all.js +0 -457
  406. package/src/scripts/nginx-init.js +0 -718
  407. package/src/scripts/npmi.js +0 -382
  408. package/src/scripts/o.js +0 -511
  409. package/src/scripts/org-by-date.js +0 -338
  410. package/src/scripts/p.js +0 -224
  411. package/src/scripts/packages.js +0 -330
  412. package/src/scripts/path.js +0 -225
  413. package/src/scripts/ports.js +0 -597
  414. package/src/scripts/q.js +0 -305
  415. package/src/scripts/refresh-files.js +0 -394
  416. package/src/scripts/remove-smaller-files.js +0 -516
  417. package/src/scripts/rename-files-with-date.js +0 -533
  418. package/src/scripts/resize-image.js +0 -539
  419. package/src/scripts/rm-safe.js +0 -669
  420. package/src/scripts/s.js +0 -540
  421. package/src/scripts/set-git-public.js +0 -365
  422. package/src/scripts/show-desktop-icons.js +0 -475
  423. package/src/scripts/show-hidden-files.js +0 -472
  424. package/src/scripts/tpa.js +0 -280
  425. package/src/scripts/tpo.js +0 -280
  426. package/src/scripts/u.js +0 -505
  427. package/src/scripts/vpush.js +0 -437
  428. package/src/scripts/y.js +0 -283
  429. package/src/utils/README.md +0 -95
  430. package/src/utils/common/apps.js +0 -143
  431. package/src/utils/common/display.js +0 -157
  432. package/src/utils/common/network.js +0 -185
  433. package/src/utils/common/os.js +0 -294
  434. package/src/utils/common/package-manager.js +0 -301
  435. package/src/utils/common/privileges.js +0 -138
  436. package/src/utils/common/shell.js +0 -261
  437. package/src/utils/macos/apps.js +0 -228
  438. package/src/utils/macos/brew.js +0 -315
  439. package/src/utils/ubuntu/apt.js +0 -307
  440. package/src/utils/ubuntu/desktop.js +0 -292
  441. package/src/utils/ubuntu/snap.js +0 -344
  442. package/src/utils/ubuntu/systemd.js +0 -286
  443. package/src/utils/windows/choco.js +0 -465
  444. package/src/utils/windows/env.js +0 -246
  445. package/src/utils/windows/registry.js +0 -269
  446. package/src/utils/windows/shell.js +0 -240
  447. package/src/utils/windows/winget.js +0 -489
@@ -1,1056 +0,0 @@
1
- # Installing GPG (GnuPG)
2
-
3
- ## Overview
4
-
5
- GnuPG (GNU Privacy Guard), commonly known as GPG, is a free and open-source implementation of the OpenPGP standard (RFC 4880). It enables you to encrypt and sign your data and communications, providing cryptographic privacy and authentication.
6
-
7
- GPG enables developers to:
8
-
9
- - Sign Git commits and tags to verify authorship
10
- - Encrypt sensitive files and communications
11
- - Verify the integrity and authenticity of downloaded software
12
- - Manage cryptographic keys for secure communications
13
- - Authenticate to remote services using GPG keys
14
-
15
- GnuPG is an essential tool for secure software development workflows, particularly for signing Git commits (a requirement for many open-source projects and enterprise environments).
16
-
17
- This guide documents GPG installation procedures for all platforms supported by DevUtils CLI.
18
-
19
- ## Dependencies
20
-
21
- ### macOS (Homebrew)
22
-
23
- - **Required:**
24
- - `homebrew` - Install via `/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"` or run `dev install homebrew`
25
- - **Optional:** None
26
- - **Auto-installed:**
27
- - `pinentry-mac` - Installed automatically by the script for GUI passphrase dialogs (required for signing Git commits in GUI applications)
28
-
29
- ### Ubuntu (APT/Snap)
30
-
31
- - **Required:** None
32
- - **Optional:**
33
- - `pinentry-gnome3` - For GUI passphrase dialogs in desktop environments. Install via `sudo apt install pinentry-gnome3`
34
- - `pinentry-curses` - For terminal-based passphrase entry (included with `gnupg` package by default)
35
- - **Auto-installed:** None
36
-
37
- ### Raspberry Pi OS (APT/Snap)
38
-
39
- - **Required:** None
40
- - **Optional:**
41
- - `pinentry-curses` - For terminal-based passphrase entry on headless systems (included with `gnupg` package by default). Install via `sudo apt install pinentry-curses`
42
- - `haveged` - For improving entropy generation during key creation on headless systems. Install via `sudo apt install haveged`
43
- - **Auto-installed:** None
44
-
45
- ### Amazon Linux (DNF/YUM)
46
-
47
- - **Required:** None
48
- - **Optional:** None
49
- - **Auto-installed:** None
50
- - **Notes:**
51
- - Amazon Linux 2023 ships with `gnupg2-minimal` by default, which the script replaces with `gnupg2-full` using `dnf swap`
52
- - Amazon Linux 2 installs `gnupg2` directly
53
-
54
- ### Windows (Chocolatey/winget)
55
-
56
- - **Required:**
57
- - Either `winget` (built into Windows 10 1809+ and Windows 11) or `chocolatey` - Install Chocolatey via PowerShell: `Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))` or run `dev install chocolatey`
58
- - **Optional:** None
59
- - **Auto-installed:**
60
- - Graphical pinentry for Windows - Included with GnuPG for Windows installation
61
-
62
- ### Git Bash (Manual/Portable)
63
-
64
- - **Required:**
65
- - Windows GPG installation - Must install GPG on Windows first using winget or Chocolatey (see Windows section above)
66
- - `git` - Install via Git for Windows installer from https://git-scm.com/download/win
67
- - **Optional:** None
68
- - **Auto-installed:** None
69
- - **Notes:**
70
- - Git Bash does not have a separate GPG installation; it configures Git to use the Windows GPG binary at `/c/Program Files (x86)/GnuPG/bin/gpg.exe`
71
-
72
- ## Prerequisites
73
-
74
- Before installing GPG on any platform, ensure:
75
-
76
- 1. **Internet connectivity** - Required to download GPG packages
77
- 2. **Administrative privileges** - Required for system-wide installation
78
- 3. **Terminal access** - Required to run installation commands
79
-
80
- ## Platform-Specific Installation
81
-
82
- ### macOS (Homebrew)
83
-
84
- #### Prerequisites
85
-
86
- - macOS 10.15 (Catalina) or later (macOS 14 Sonoma or later recommended)
87
- - Homebrew package manager installed
88
- - Command line access via Terminal.app or iTerm2
89
-
90
- If Homebrew is not installed, install it first:
91
-
92
- ```bash
93
- /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
94
- ```
95
-
96
- #### Installation Steps
97
-
98
- Run the following commands to install GnuPG and pinentry-mac (for GUI passphrase dialogs):
99
-
100
- ```bash
101
- brew install --quiet gnupg
102
- brew install --quiet pinentry-mac
103
- ```
104
-
105
- The `--quiet` flag suppresses non-essential output, making the installation suitable for automation and scripts.
106
-
107
- **Configure pinentry-mac for passphrase dialogs:**
108
-
109
- Create the GnuPG configuration directory and configure the GPG agent to use pinentry-mac:
110
-
111
- ```bash
112
- mkdir -p ~/.gnupg
113
- chmod 700 ~/.gnupg
114
- echo "pinentry-program $(brew --prefix)/bin/pinentry-mac" >> ~/.gnupg/gpg-agent.conf
115
- gpgconf --kill gpg-agent
116
- ```
117
-
118
- This configuration enables a native macOS dialog for entering GPG passphrases, which is required for signing Git commits.
119
-
120
- #### Verification
121
-
122
- Confirm the installation succeeded:
123
-
124
- ```bash
125
- gpg --version
126
- ```
127
-
128
- Expected output (version numbers may vary):
129
-
130
- ```
131
- gpg (GnuPG) 2.4.9
132
- libgcrypt 1.10.3
133
- ...
134
- ```
135
-
136
- Verify pinentry-mac is configured:
137
-
138
- ```bash
139
- cat ~/.gnupg/gpg-agent.conf
140
- ```
141
-
142
- Expected output should include:
143
-
144
- ```
145
- pinentry-program /opt/homebrew/bin/pinentry-mac
146
- ```
147
-
148
- (On Intel Macs, the path will be `/usr/local/bin/pinentry-mac`)
149
-
150
- #### Troubleshooting
151
-
152
- **Problem**: `gpg --version` shows an older version after installation
153
-
154
- **Solution**: The system may have a different GPG in PATH. Ensure Homebrew's bin directory is first in your PATH:
155
-
156
- ```bash
157
- echo 'export PATH="$(brew --prefix)/bin:$PATH"' >> ~/.zshrc
158
- source ~/.zshrc
159
- ```
160
-
161
- **Problem**: `brew: command not found`
162
-
163
- **Solution**: Homebrew is not installed or not in PATH. Install Homebrew first:
164
-
165
- ```bash
166
- /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
167
- ```
168
-
169
- **Problem**: Passphrase prompt does not appear when signing commits
170
-
171
- **Solution**: The GPG agent may not be using pinentry-mac. Verify the configuration and restart the agent:
172
-
173
- ```bash
174
- echo "pinentry-program $(brew --prefix)/bin/pinentry-mac" > ~/.gnupg/gpg-agent.conf
175
- gpgconf --kill gpg-agent
176
- ```
177
-
178
- **Problem**: "No pinentry" error when generating keys
179
-
180
- **Solution**: Install and configure pinentry-mac as shown above, then restart the GPG agent.
181
-
182
- **Problem**: Permission errors on `~/.gnupg`
183
-
184
- **Solution**: Fix permissions on the GnuPG directory:
185
-
186
- ```bash
187
- chmod 700 ~/.gnupg
188
- chmod 600 ~/.gnupg/*
189
- ```
190
-
191
- ---
192
-
193
- ### Ubuntu/Debian (APT)
194
-
195
- #### Prerequisites
196
-
197
- - Ubuntu 20.04 LTS or later, or Debian 11 (Bullseye) or later
198
- - sudo privileges
199
- - Internet connectivity
200
-
201
- GnuPG is included in the default Ubuntu and Debian repositories and may already be installed on most systems.
202
-
203
- #### Installation Steps
204
-
205
- Run the following commands to update package lists and install GnuPG:
206
-
207
- ```bash
208
- sudo DEBIAN_FRONTEND=noninteractive apt-get update -y
209
- sudo DEBIAN_FRONTEND=noninteractive apt-get install -y gnupg
210
- ```
211
-
212
- The `DEBIAN_FRONTEND=noninteractive` environment variable ensures no interactive prompts appear during installation, making this suitable for scripts and automation.
213
-
214
- **Note**: On modern Debian/Ubuntu systems (Debian 12+, Ubuntu 22.04+), the `gnupg` package installs GnuPG version 2.x. The `gpg` command automatically uses version 2.
215
-
216
- #### Verification
217
-
218
- Confirm the installation succeeded:
219
-
220
- ```bash
221
- gpg --version
222
- ```
223
-
224
- Expected output (version numbers may vary):
225
-
226
- ```
227
- gpg (GnuPG) 2.2.40
228
- libgcrypt 1.10.1
229
- ...
230
- ```
231
-
232
- Verify the installation location:
233
-
234
- ```bash
235
- which gpg
236
- ```
237
-
238
- Expected output:
239
-
240
- ```
241
- /usr/bin/gpg
242
- ```
243
-
244
- #### Troubleshooting
245
-
246
- **Problem**: `E: Unable to locate package gnupg`
247
-
248
- **Solution**: Update your package lists:
249
-
250
- ```bash
251
- sudo DEBIAN_FRONTEND=noninteractive apt-get update -y
252
- ```
253
-
254
- **Problem**: Old version of GPG installed
255
-
256
- **Solution**: On Ubuntu, you can use the official GnuPG repository for newer versions. However, the default repository version is sufficient for most use cases including Git commit signing.
257
-
258
- **Problem**: "No pinentry" error when generating keys
259
-
260
- **Solution**: Install a pinentry package appropriate for your environment:
261
-
262
- ```bash
263
- # For GUI environments
264
- sudo DEBIAN_FRONTEND=noninteractive apt-get install -y pinentry-gnome3
265
-
266
- # For terminal/server environments
267
- sudo DEBIAN_FRONTEND=noninteractive apt-get install -y pinentry-curses
268
- ```
269
-
270
- **Problem**: `gpg-agent` errors
271
-
272
- **Solution**: Restart the GPG agent:
273
-
274
- ```bash
275
- gpgconf --kill gpg-agent
276
- gpg-agent --daemon
277
- ```
278
-
279
- ---
280
-
281
- ### Raspberry Pi OS (APT)
282
-
283
- #### Prerequisites
284
-
285
- - Raspberry Pi OS (Bookworm or Bullseye recommended)
286
- - Raspberry Pi 3B+ or later (any model supported by Raspberry Pi OS)
287
- - sudo privileges
288
- - Internet connectivity
289
-
290
- Raspberry Pi OS is based on Debian, so GPG installation follows the Debian/APT method. GPG works on both 32-bit (armhf) and 64-bit (arm64) architectures.
291
-
292
- #### Installation Steps
293
-
294
- First, verify your architecture:
295
-
296
- ```bash
297
- uname -m
298
- ```
299
-
300
- - `aarch64` = 64-bit ARM
301
- - `armv7l` = 32-bit ARM
302
-
303
- Install GnuPG using APT:
304
-
305
- ```bash
306
- sudo DEBIAN_FRONTEND=noninteractive apt-get update -y
307
- sudo DEBIAN_FRONTEND=noninteractive apt-get install -y gnupg
308
- ```
309
-
310
- The installation command is identical for both 32-bit and 64-bit Raspberry Pi OS.
311
-
312
- **For headless/server installations**, install pinentry-curses for terminal-based passphrase entry:
313
-
314
- ```bash
315
- sudo DEBIAN_FRONTEND=noninteractive apt-get install -y pinentry-curses
316
- ```
317
-
318
- #### Verification
319
-
320
- Confirm the installation succeeded:
321
-
322
- ```bash
323
- gpg --version
324
- ```
325
-
326
- Expected output (version numbers may vary):
327
-
328
- ```
329
- gpg (GnuPG) 2.2.40
330
- libgcrypt 1.10.1
331
- ...
332
- ```
333
-
334
- Verify the installation location:
335
-
336
- ```bash
337
- which gpg
338
- ```
339
-
340
- Expected output:
341
-
342
- ```
343
- /usr/bin/gpg
344
- ```
345
-
346
- #### Troubleshooting
347
-
348
- **Problem**: Installation is slow
349
-
350
- **Solution**: Raspberry Pi SD cards can be slow. Use a high-quality SD card (Class 10 or A1/A2 rated) or boot from USB/SSD for better performance.
351
-
352
- **Problem**: "No pinentry" error when generating keys on headless Pi
353
-
354
- **Solution**: Install and configure pinentry-curses:
355
-
356
- ```bash
357
- sudo DEBIAN_FRONTEND=noninteractive apt-get install -y pinentry-curses
358
- mkdir -p ~/.gnupg
359
- echo "pinentry-program /usr/bin/pinentry-curses" > ~/.gnupg/gpg-agent.conf
360
- gpgconf --kill gpg-agent
361
- ```
362
-
363
- **Problem**: `E: Unable to fetch some archives`
364
-
365
- **Solution**: Network connectivity issues. Check your internet connection and retry:
366
-
367
- ```bash
368
- sudo DEBIAN_FRONTEND=noninteractive apt-get update -y
369
- sudo DEBIAN_FRONTEND=noninteractive apt-get install -y gnupg
370
- ```
371
-
372
- **Problem**: Key generation hangs (waiting for entropy)
373
-
374
- **Solution**: On headless Raspberry Pi systems, the entropy pool may be low. Install `haveged` to improve entropy generation:
375
-
376
- ```bash
377
- sudo DEBIAN_FRONTEND=noninteractive apt-get install -y haveged
378
- sudo systemctl enable haveged
379
- sudo systemctl start haveged
380
- ```
381
-
382
- ---
383
-
384
- ### Amazon Linux (DNF/YUM)
385
-
386
- #### Prerequisites
387
-
388
- - Amazon Linux 2023 (AL2023) or Amazon Linux 2 (AL2)
389
- - sudo privileges
390
- - EC2 instance or compatible environment
391
-
392
- Amazon Linux 2023 uses DNF as the default package manager. Amazon Linux 2 uses YUM.
393
-
394
- **Important**: Amazon Linux 2023 ships with `gnupg2-minimal` by default, which provides only basic GPG functionality for package signature verification. For full GPG functionality (including key server access and Git commit signing), you need `gnupg2-full`.
395
-
396
- #### Installation Steps
397
-
398
- **For Amazon Linux 2023 (AL2023):**
399
-
400
- Replace the minimal package with the full package:
401
-
402
- ```bash
403
- sudo dnf swap -y gnupg2-minimal gnupg2-full
404
- ```
405
-
406
- The `dnf swap` command removes `gnupg2-minimal` and installs `gnupg2-full` in a single transaction, handling the package conflict automatically.
407
-
408
- **For Amazon Linux 2 (AL2):**
409
-
410
- ```bash
411
- sudo yum install -y gnupg2
412
- ```
413
-
414
- The `-y` flag automatically confirms installation, enabling non-interactive execution.
415
-
416
- #### Verification
417
-
418
- Confirm the installation succeeded:
419
-
420
- ```bash
421
- gpg --version
422
- ```
423
-
424
- Expected output (version numbers may vary):
425
-
426
- ```
427
- gpg (GnuPG) 2.3.8
428
- libgcrypt 1.10.1
429
- ...
430
- ```
431
-
432
- Verify the installation location:
433
-
434
- ```bash
435
- which gpg
436
- ```
437
-
438
- Expected output:
439
-
440
- ```
441
- /usr/bin/gpg
442
- ```
443
-
444
- **For Amazon Linux 2023**, verify you have the full package:
445
-
446
- ```bash
447
- rpm -q gnupg2-full
448
- ```
449
-
450
- Expected output:
451
-
452
- ```
453
- gnupg2-full-2.3.8-1.amzn2023.0.4.x86_64
454
- ```
455
-
456
- #### Troubleshooting
457
-
458
- **Problem**: `keyserver receive failed: No dirmngr` on AL2023
459
-
460
- **Solution**: You have the minimal package installed. Install the full package:
461
-
462
- ```bash
463
- sudo dnf swap -y gnupg2-minimal gnupg2-full
464
- ```
465
-
466
- **Problem**: `package gnupg2-minimal conflicts with gnupg2` error
467
-
468
- **Solution**: Use `dnf swap` instead of `dnf install` to handle the conflict:
469
-
470
- ```bash
471
- sudo dnf swap -y gnupg2-minimal gnupg2-full
472
- ```
473
-
474
- **Problem**: `No match for argument: gnupg2` on Amazon Linux 2
475
-
476
- **Solution**: Update the yum cache and retry:
477
-
478
- ```bash
479
- sudo yum makecache
480
- sudo yum install -y gnupg2
481
- ```
482
-
483
- **Problem**: Permission denied errors
484
-
485
- **Solution**: Ensure you are using sudo:
486
-
487
- ```bash
488
- sudo dnf swap -y gnupg2-minimal gnupg2-full
489
- ```
490
-
491
- ---
492
-
493
- ### Windows (Chocolatey/winget)
494
-
495
- #### Prerequisites
496
-
497
- - Windows 10 version 1903 or higher (64-bit), or Windows 11
498
- - Administrator PowerShell or Command Prompt
499
- - Chocolatey or winget package manager installed
500
-
501
- **Recommended**: Use winget (built into Windows 10 1809+ and Windows 11). If winget is unavailable, use Chocolatey.
502
-
503
- If Chocolatey is not installed and you prefer to use it, install it first by running this command in an Administrator PowerShell:
504
-
505
- ```powershell
506
- Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
507
- ```
508
-
509
- #### Installation Steps
510
-
511
- **Using winget (recommended):**
512
-
513
- Run the following command in an Administrator PowerShell or Command Prompt:
514
-
515
- ```powershell
516
- winget install --id GnuPG.GnuPG --silent --accept-package-agreements --accept-source-agreements
517
- ```
518
-
519
- **Using Chocolatey:**
520
-
521
- ```powershell
522
- choco install gnupg -y
523
- ```
524
-
525
- The `--silent` flag (winget) and `-y` flag (Chocolatey) ensure non-interactive installation suitable for automation and scripts.
526
-
527
- After installation, close and reopen your terminal to ensure PATH changes take effect.
528
-
529
- #### Verification
530
-
531
- Open a new Command Prompt or PowerShell window, then run:
532
-
533
- ```powershell
534
- gpg --version
535
- ```
536
-
537
- Expected output (version numbers may vary):
538
-
539
- ```
540
- gpg (GnuPG) 2.4.5
541
- libgcrypt 1.10.3
542
- ...
543
- ```
544
-
545
- Verify the installation location:
546
-
547
- ```powershell
548
- where gpg
549
- ```
550
-
551
- Expected output:
552
-
553
- ```
554
- C:\Program Files (x86)\GnuPG\bin\gpg.exe
555
- ```
556
-
557
- #### Troubleshooting
558
-
559
- **Problem**: `gpg: command not found` or `'gpg' is not recognized`
560
-
561
- **Solution**: Close and reopen your terminal window. If the problem persists, add GPG to your PATH manually:
562
-
563
- ```powershell
564
- $env:PATH += ";C:\Program Files (x86)\GnuPG\bin"
565
- ```
566
-
567
- To make this permanent, add the path via System Properties > Environment Variables, or run in Administrator PowerShell:
568
-
569
- ```powershell
570
- [Environment]::SetEnvironmentVariable("PATH", $env:PATH + ";C:\Program Files (x86)\GnuPG\bin", [EnvironmentVariableTarget]::Machine)
571
- ```
572
-
573
- **Problem**: winget installation fails
574
-
575
- **Solution**: Fall back to Chocolatey:
576
-
577
- ```powershell
578
- choco install gnupg -y
579
- ```
580
-
581
- **Problem**: Passphrase dialog does not appear
582
-
583
- **Solution**: GnuPG on Windows includes a graphical pinentry. Ensure the gpg-agent is running:
584
-
585
- ```powershell
586
- gpg-connect-agent /bye
587
- ```
588
-
589
- **Problem**: Chocolatey installation fails
590
-
591
- **Solution**: Ensure you are running PowerShell as Administrator. Right-click PowerShell and select "Run as administrator".
592
-
593
- ---
594
-
595
- ### WSL (Ubuntu)
596
-
597
- #### Prerequisites
598
-
599
- - Windows 10 version 2004 or higher, or Windows 11
600
- - WSL 2 enabled with Ubuntu distribution installed
601
- - sudo privileges within WSL
602
-
603
- WSL runs Ubuntu (or another Linux distribution) within Windows. GPG must be installed separately within WSL, as it does not share binaries with Windows GPG.
604
-
605
- #### Installation Steps
606
-
607
- Open your WSL Ubuntu terminal and run:
608
-
609
- ```bash
610
- sudo DEBIAN_FRONTEND=noninteractive apt-get update -y
611
- sudo DEBIAN_FRONTEND=noninteractive apt-get install -y gnupg
612
- ```
613
-
614
- **Optional**: For GUI passphrase dialogs when using WSL with a graphical environment, install pinentry-gnome3:
615
-
616
- ```bash
617
- sudo DEBIAN_FRONTEND=noninteractive apt-get install -y pinentry-gnome3
618
- ```
619
-
620
- For terminal-only WSL usage, pinentry-curses is sufficient (included with gnupg).
621
-
622
- #### Verification
623
-
624
- Confirm the installation succeeded:
625
-
626
- ```bash
627
- gpg --version
628
- ```
629
-
630
- Expected output (version numbers may vary):
631
-
632
- ```
633
- gpg (GnuPG) 2.2.40
634
- libgcrypt 1.10.1
635
- ...
636
- ```
637
-
638
- Verify the installation location:
639
-
640
- ```bash
641
- which gpg
642
- ```
643
-
644
- Expected output:
645
-
646
- ```
647
- /usr/bin/gpg
648
- ```
649
-
650
- #### Troubleshooting
651
-
652
- **Problem**: GPG version differs between WSL and Windows
653
-
654
- **Solution**: This is expected behavior. WSL and Windows maintain separate GPG installations. Use the appropriate GPG for each environment:
655
-
656
- - Inside WSL terminal: Use Linux GPG (`/usr/bin/gpg`)
657
- - In Windows PowerShell/CMD: Use Windows GPG (`C:\Program Files (x86)\GnuPG\bin\gpg.exe`)
658
-
659
- **Problem**: Cannot share GPG keys between WSL and Windows
660
-
661
- **Solution**: GPG keys are stored in different locations for each environment. You can export and import keys between environments:
662
-
663
- ```bash
664
- # In WSL, export your key
665
- gpg --export-secret-keys --armor your-key-id > private-key.asc
666
-
667
- # In Windows PowerShell, import the key
668
- gpg --import "\\wsl$\Ubuntu\home\username\private-key.asc"
669
- ```
670
-
671
- **Problem**: "No pinentry" error in WSL
672
-
673
- **Solution**: Ensure pinentry is installed and configured:
674
-
675
- ```bash
676
- sudo DEBIAN_FRONTEND=noninteractive apt-get install -y pinentry-curses
677
- mkdir -p ~/.gnupg
678
- echo "pinentry-program /usr/bin/pinentry-curses" > ~/.gnupg/gpg-agent.conf
679
- gpgconf --kill gpg-agent
680
- ```
681
-
682
- **Problem**: Permission errors in WSL
683
-
684
- **Solution**: Ensure you are using sudo for installation:
685
-
686
- ```bash
687
- sudo DEBIAN_FRONTEND=noninteractive apt-get install -y gnupg
688
- ```
689
-
690
- ---
691
-
692
- ### Git Bash (Windows Installation)
693
-
694
- #### Prerequisites
695
-
696
- - Windows 10 or Windows 11 (64-bit)
697
- - Git Bash installed (comes with Git for Windows)
698
- - GPG installed on Windows (see Windows section)
699
-
700
- **Note**: Git Bash on Windows does not include a usable GPG installation by default. Git for Windows ships with an older GPG 1.4.x in the MinGW environment, but this is insufficient for modern use cases like Git commit signing. You must install GPG on Windows separately.
701
-
702
- #### Installation Steps
703
-
704
- **Step 1: Install GPG on Windows**
705
-
706
- First, install GPG on Windows using winget (run in Administrator PowerShell):
707
-
708
- ```powershell
709
- winget install --id GnuPG.GnuPG --silent --accept-package-agreements --accept-source-agreements
710
- ```
711
-
712
- Or using Chocolatey:
713
-
714
- ```powershell
715
- choco install gnupg -y
716
- ```
717
-
718
- **Step 2: Configure Git to use Windows GPG**
719
-
720
- Open Git Bash and configure Git to use the Windows GPG installation instead of the bundled MinGW GPG:
721
-
722
- ```bash
723
- git config --global gpg.program "/c/Program Files (x86)/GnuPG/bin/gpg.exe"
724
- ```
725
-
726
- This tells Git to use the Windows GPG for all signing operations.
727
-
728
- **Step 3: Close and reopen Git Bash**
729
-
730
- Close all Git Bash windows and open a new one to ensure environment changes take effect.
731
-
732
- #### Verification
733
-
734
- In Git Bash, confirm GPG is accessible via the configured path:
735
-
736
- ```bash
737
- "/c/Program Files (x86)/GnuPG/bin/gpg.exe" --version
738
- ```
739
-
740
- Expected output (version numbers may vary):
741
-
742
- ```
743
- gpg (GnuPG) 2.4.5
744
- libgcrypt 1.10.3
745
- ...
746
- ```
747
-
748
- Verify Git is configured to use Windows GPG:
749
-
750
- ```bash
751
- git config --global gpg.program
752
- ```
753
-
754
- Expected output:
755
-
756
- ```
757
- /c/Program Files (x86)/GnuPG/bin/gpg.exe
758
- ```
759
-
760
- #### Troubleshooting
761
-
762
- **Problem**: `gpg` command in Git Bash uses old version
763
-
764
- **Solution**: Git Bash's built-in GPG is old and limited. Configure Git to use Windows GPG:
765
-
766
- ```bash
767
- git config --global gpg.program "/c/Program Files (x86)/GnuPG/bin/gpg.exe"
768
- ```
769
-
770
- You can also create an alias to use Windows GPG directly:
771
-
772
- ```bash
773
- echo 'alias gpg="/c/Program\ Files\ \(x86\)/GnuPG/bin/gpg.exe"' >> ~/.bashrc
774
- source ~/.bashrc
775
- ```
776
-
777
- **Problem**: Git commit signing fails with "secret key not available"
778
-
779
- **Solution**: Keys must be imported into Windows GPG, not the Git Bash MinGW GPG. Use the Windows GPG to generate or import keys:
780
-
781
- ```bash
782
- "/c/Program Files (x86)/GnuPG/bin/gpg.exe" --list-secret-keys
783
- ```
784
-
785
- If no keys are listed, generate one:
786
-
787
- ```bash
788
- "/c/Program Files (x86)/GnuPG/bin/gpg.exe" --full-generate-key
789
- ```
790
-
791
- **Problem**: GPG passphrase prompt does not appear
792
-
793
- **Solution**: Windows GPG uses a graphical pinentry that may not work correctly from Git Bash in some configurations. Ensure the GPG agent is running:
794
-
795
- ```bash
796
- "/c/Program Files (x86)/GnuPG/bin/gpg-connect-agent.exe" /bye
797
- ```
798
-
799
- **Problem**: "gpg: signing failed: Inappropriate ioctl for device"
800
-
801
- **Solution**: This occurs when GPG cannot open a TTY for passphrase entry. Set the GPG_TTY environment variable:
802
-
803
- ```bash
804
- echo 'export GPG_TTY=$(tty)' >> ~/.bashrc
805
- source ~/.bashrc
806
- ```
807
-
808
- **Problem**: Path issues with spaces in "Program Files (x86)"
809
-
810
- **Solution**: Always quote paths or escape spaces when referencing the GPG executable:
811
-
812
- ```bash
813
- # Using quotes
814
- "/c/Program Files (x86)/GnuPG/bin/gpg.exe" --version
815
-
816
- # Or escaping spaces
817
- /c/Program\ Files\ \(x86\)/GnuPG/bin/gpg.exe --version
818
- ```
819
-
820
- ---
821
-
822
- ## Post-Installation Configuration
823
-
824
- After installing GPG on any platform, configure it for Git commit signing (the most common developer use case).
825
-
826
- ### Generate a GPG Key
827
-
828
- Generate a new GPG key pair:
829
-
830
- ```bash
831
- gpg --full-generate-key
832
- ```
833
-
834
- When prompted:
835
-
836
- 1. Select key type: Choose `(1) RSA and RSA` or `(9) ECC and ECC` (recommended)
837
- 2. For ECC, select `(1) Curve 25519`
838
- 3. Key validity: Choose `2y` (2 years) or `0` (no expiration)
839
- 4. Enter your name and email (use the same email as your Git commits)
840
- 5. Set a strong passphrase
841
-
842
- ### List Your GPG Keys
843
-
844
- View your secret keys:
845
-
846
- ```bash
847
- gpg --list-secret-keys --keyid-format=long
848
- ```
849
-
850
- Example output:
851
-
852
- ```
853
- sec ed25519/ABC123DEF456GH78 2024-01-15 [SC] [expires: 2026-01-15]
854
- 1234567890ABCDEF1234567890ABCDEF12345678
855
- uid [ultimate] Your Name <your.email@example.com>
856
- ssb cv25519/XYZ789ABC123DE45 2024-01-15 [E] [expires: 2026-01-15]
857
- ```
858
-
859
- The key ID is the string after `ed25519/` or `rsa4096/` (e.g., `ABC123DEF456GH78`).
860
-
861
- ### Configure Git to Sign Commits
862
-
863
- Tell Git which GPG key to use:
864
-
865
- ```bash
866
- git config --global user.signingkey ABC123DEF456GH78
867
- ```
868
-
869
- Enable automatic commit signing:
870
-
871
- ```bash
872
- git config --global commit.gpgsign true
873
- ```
874
-
875
- Enable automatic tag signing:
876
-
877
- ```bash
878
- git config --global tag.gpgsign true
879
- ```
880
-
881
- ### Export Your Public Key for GitHub/GitLab
882
-
883
- Export your public key in ASCII-armored format:
884
-
885
- ```bash
886
- gpg --armor --export ABC123DEF456GH78
887
- ```
888
-
889
- Copy the entire output (including `-----BEGIN PGP PUBLIC KEY BLOCK-----` and `-----END PGP PUBLIC KEY BLOCK-----`) and add it to your GitHub/GitLab account settings under GPG keys.
890
-
891
- ### Configure GPG Agent Caching
892
-
893
- To avoid entering your passphrase repeatedly, configure the GPG agent cache timeout. Create or edit `~/.gnupg/gpg-agent.conf`:
894
-
895
- ```bash
896
- mkdir -p ~/.gnupg
897
- cat >> ~/.gnupg/gpg-agent.conf << 'EOF'
898
- default-cache-ttl 3600
899
- max-cache-ttl 86400
900
- EOF
901
- gpgconf --kill gpg-agent
902
- ```
903
-
904
- This caches your passphrase for 1 hour (3600 seconds), with a maximum of 24 hours (86400 seconds).
905
-
906
- ---
907
-
908
- ## Common Issues
909
-
910
- ### Issue: "No secret key" When Signing Commits
911
-
912
- **Symptoms**: `gpg: signing failed: No secret key`
913
-
914
- **Solutions**:
915
-
916
- - Verify your key exists:
917
-
918
- ```bash
919
- gpg --list-secret-keys --keyid-format=long
920
- ```
921
-
922
- - Ensure Git is configured with the correct key ID:
923
-
924
- ```bash
925
- git config --global user.signingkey YOUR_KEY_ID
926
- ```
927
-
928
- - On Windows Git Bash, ensure Git uses Windows GPG:
929
-
930
- ```bash
931
- git config --global gpg.program "/c/Program Files (x86)/GnuPG/bin/gpg.exe"
932
- ```
933
-
934
- ### Issue: "Inappropriate ioctl for device"
935
-
936
- **Symptoms**: `gpg: signing failed: Inappropriate ioctl for device`
937
-
938
- **Solutions**:
939
-
940
- - Set the GPG_TTY environment variable:
941
-
942
- ```bash
943
- export GPG_TTY=$(tty)
944
- ```
945
-
946
- - Add to your shell profile (`~/.bashrc`, `~/.zshrc`):
947
-
948
- ```bash
949
- echo 'export GPG_TTY=$(tty)' >> ~/.bashrc
950
- ```
951
-
952
- ### Issue: Passphrase Prompt Not Appearing
953
-
954
- **Symptoms**: GPG hangs waiting for passphrase, or fails immediately
955
-
956
- **Solutions**:
957
-
958
- - **macOS**: Ensure pinentry-mac is installed and configured:
959
-
960
- ```bash
961
- brew install --quiet pinentry-mac
962
- echo "pinentry-program $(brew --prefix)/bin/pinentry-mac" > ~/.gnupg/gpg-agent.conf
963
- gpgconf --kill gpg-agent
964
- ```
965
-
966
- - **Linux**: Ensure appropriate pinentry is installed:
967
-
968
- ```bash
969
- sudo DEBIAN_FRONTEND=noninteractive apt-get install -y pinentry-curses
970
- ```
971
-
972
- - Restart the GPG agent:
973
-
974
- ```bash
975
- gpgconf --kill gpg-agent
976
- ```
977
-
978
- ### Issue: "No pinentry" Error
979
-
980
- **Symptoms**: `gpg: problem with the agent: No pinentry`
981
-
982
- **Solutions**:
983
-
984
- - Install pinentry for your platform:
985
-
986
- ```bash
987
- # macOS
988
- brew install --quiet pinentry-mac
989
-
990
- # Ubuntu/Debian/Raspberry Pi
991
- sudo DEBIAN_FRONTEND=noninteractive apt-get install -y pinentry-curses
992
- ```
993
-
994
- - Configure gpg-agent to use the correct pinentry:
995
-
996
- ```bash
997
- mkdir -p ~/.gnupg
998
- echo "pinentry-program /path/to/pinentry" > ~/.gnupg/gpg-agent.conf
999
- gpgconf --kill gpg-agent
1000
- ```
1001
-
1002
- ### Issue: Key Generation Hangs
1003
-
1004
- **Symptoms**: Key generation never completes, appears frozen
1005
-
1006
- **Solutions**:
1007
-
1008
- - This usually indicates insufficient entropy. Generate activity on the system (move mouse, type, disk activity).
1009
-
1010
- - On headless systems, install `haveged`:
1011
-
1012
- ```bash
1013
- sudo DEBIAN_FRONTEND=noninteractive apt-get install -y haveged
1014
- sudo systemctl enable haveged
1015
- sudo systemctl start haveged
1016
- ```
1017
-
1018
- ### Issue: Cannot Import Keys from Another System
1019
-
1020
- **Symptoms**: Imported keys are not usable for signing
1021
-
1022
- **Solutions**:
1023
-
1024
- - Export and import both public and secret keys:
1025
-
1026
- ```bash
1027
- # On source system
1028
- gpg --export-secret-keys --armor KEY_ID > private.asc
1029
- gpg --export --armor KEY_ID > public.asc
1030
-
1031
- # On destination system
1032
- gpg --import public.asc
1033
- gpg --import private.asc
1034
- ```
1035
-
1036
- - Trust the imported key:
1037
-
1038
- ```bash
1039
- gpg --edit-key KEY_ID trust quit
1040
- # Select trust level 5 (ultimate) for your own key
1041
- ```
1042
-
1043
- ---
1044
-
1045
- ## References
1046
-
1047
- - [GnuPG Official Website](https://gnupg.org/)
1048
- - [GnuPG Official Documentation](https://gnupg.org/documentation/)
1049
- - [GnuPG Download Page](https://gnupg.org/download/)
1050
- - [GitHub: Signing Commits](https://docs.github.com/en/authentication/managing-commit-signature-verification/signing-commits)
1051
- - [GitLab: Signing Commits with GPG](https://docs.gitlab.com/ee/user/project/repository/signed_commits/gpg.html)
1052
- - [Homebrew GnuPG Formula](https://formulae.brew.sh/formula/gnupg)
1053
- - [Chocolatey GnuPG Package](https://community.chocolatey.org/packages/gnupg)
1054
- - [winget GnuPG Package](https://winget.run/pkg/GnuPG/GnuPG)
1055
- - [AWS Documentation: GnuPG on Amazon Linux 2023](https://docs.aws.amazon.com/linux/al2023/ug/gnupg-minimal.html)
1056
- - [Debian Wiki: GnuPG](https://wiki.debian.org/GnuPG)