厂商协议地址描述
阿里云UDP223.5.5.5速度快且纯净,适合国内
Quad 101DoH101.102.103.104台湾官方机构,隐私安全,速度快,适合国内
CloudflareDoH1.1.1.1隐私安全,适合国外(注意,当前已被国内屏蔽)

介绍

有时,您可能需要从 Git 历史记录中永久删除文件。这可能是因为意外提交了敏感信息,或者只是为了减少仓库大小。本指南介绍了两种常用的方法:使用 BFG Repo-Cleaner 和 git-filter-repo。这两种方法都会重写 Git 历史记录,因此,遵循安全预防措施以避免数据丢失是至关重要的。

安全注意事项

  1. 备份您的仓库:在进行任何历史重写之前,请创建仓库的备份。您可以将仓库克隆到单独的位置:

    git clone --mirror https://github.com/your-user/your-repo.git your-repo-backup
  2. 与您的团队沟通:通知您的团队有关历史重写的情况,因为这将要求所有人重新克隆仓库。

  3. 在单独的分支上测试:在单独的分支上执行历史重写,以确保一切正常,然后再将更改推送到主分支。

使用 BFG Repo-Cleaner

BFG Repo-Cleaner 是一种删除大型文件或敏感数据的简单快捷的替代方法,比 git-filter-branch 更快更简单。

安装

  1. 这里 下载最新版本的 BFG Repo-Cleaner。
  2. 使用 Java 运行 BFG:
    java -jar bfg-1.14.0.jar

使用 BFG 删除文件

  1. 克隆您的仓库

    git clone --mirror https://github.com/your-user/your-repo.git
    cd your-repo.git
  2. 运行 BFG 删除文件

    java -jar bfg-1.14.0.jar --delete-files your-file.txt
  3. 清理和重新打包

    git reflog expire --expire=now --all && git gc --prune=now --aggressive
  4. 推送更改

    git push --force

使用 git-filter-repo

git-filter-repo 是一个功能强大的工具,用于重写 Git 历史记录,提供比 BFG Repo-Cleaner 更大的灵活性。

安装

  1. 通过 pip 安装
    pip install git-filter-repo

使用 git-filter-repo 删除文件

  1. 克隆您的仓库

    git clone https://github.com/your-user/your-repo.git
    cd your-repo
  2. 运行 git-filter-repo

    git filter-repo --path your-file.txt --invert-paths
  3. 清理和重新打包

    git reflog expire --expire=now --all && git gc --prune=now --aggressive
  4. 推送更改

    git push --force

结论

通过遵循本指南中描述的步骤,您可以使用 BFG Repo-Cleaner 或 git-filter-repo 安全有效地从 Git 历史记录中删除文件。请记住,在重写历史记录之前备份您的仓库,并与您的团队沟通。

如何使用 GitHub 操作调试并解决此 corepack 问题。

如果你的构建突然出现 cannot find matching keyid: {"signatures":[...],"keys":[...]} 这样的失败信息,通常意味着 npm 注册表键值已被轮换,而你的旧 Corepack 无法验证 pnpm 的新版本(如 9.15.4 或 10.1.0+)。

这种情况可能发生在 GitHub Actions、GitLab、Docker 或其他使用 Corepack 管理软件包管理器的地方。

快速调试步骤

  1. 检查 Node.js 版本: node -v (如果您看到 v16.x ,则您使用的是 Node 16;如果您看到 v18.x 或更高版本,则您使用的是 Node 18+)。
  2. 检查 Corepack 版本: corepack --version. 任何早于 0.31.0 的版本都可能没有新的密钥集。
  3. 查找条件逻辑。有些工作流程只在 Node 16 上更新 Corepack。如果您在 Node 18+ 上构建,该逻辑可能会完全跳过更新。

如何修复

如果您使用的是 18+ 节点(或更新版本)

升级到最新的 Corepack (≥ 0.31.0 ):

steps:
- name: Use Latest Corepack
run: |
echo "Before: corepack version => $(corepack --version || echo 'not installed')"
npm install -g corepack@latest
echo "After : corepack version => $(corepack --version)"
corepack enable
pnpm --version

这将确保你拥有与 npm 注册表变更相匹配的新签名密钥

如果您使用的是节点 16(无法放弃节点 16 支持)

使用 Corepack 0.20 ,这是仍支持 Node 16 的最后一个版本,其中包含最新 pnpm 版本的更新密钥:

steps:
- name: Pin Corepack 0.20
run: |
echo "Before: corepack => $(corepack --version || echo 'not installed')"
npm install -g corepack@0.20
echo "After : corepack => $(corepack --version)"
corepack enable
pnpm --version

0.20 之后,较新的 Corepack 版本将不再支持 Node 16,因此,如果你还不能放弃 Node 16,这是一个安全的 “权宜之计”。

避免禁用签名检查

虽然设置 COREPACK_INTEGRITY_KEYS=0 (跳过签名检查)可以绕过错误,但也绕过了重要的安全性。只有在完全了解风险的情况下,才能使用这种方法。

摘要

  1. 检查您的 Node 和 Corepack 版本。
  2. 如果您使用的是 Node 18 以上版本,请升级到 Corepack ≥ 0.31.0 (如果您需要 Node 16,请升级到 0.20 )。
  3. 删除任何阻止 Corepack 升级在实际环境中运行的条件逻辑。
  4. 完成! 您的 CI 构建应该会成功,您也会保持安全。

更多详情,请参阅 Corepack Issue #612Corepack Releases.

怎样服药才正确?一个简单又复杂的问题

自从医院门诊取消输液,「能口服不输液」的理念也慢慢被接受。就在 8 月的某一天,一位朋友因为「发热、腹泻」来我们医院就诊,考虑「胃肠炎」,急诊医生开出验血、输液等医嘱后让「先输一天液体,如果体温 > 38.5℃ 就服退烧药。明日再来复诊。」

次日,我电话问询,朋友感觉好转,没有再腹泻,回答「不用再输液了」。根据昨晚的化验结果,我建议再来医院复诊。在我的提醒下,来医院复诊。配了「乳酸左氧氟沙星片」1 盒,告知「一日 2 次,一次 2 片」口服。此时已过 18:00。又过了一天,我再电话问询。回答:药已经吃了,19:00 吃了一次,22:30 又吃了一次。

怎样服药才正确?确实是一个简单又复杂的问题。在丁香论坛搜索,就是医务人员也有这样的困惑:口服药一日三次,多久一次?

再来看看「乳酸左氧氟沙星片」的药物说明书:

口服。成人常用量:

  1. 支气管感染、肺部感染:一次 2 片,一日 2 次,或一次 1 片,一日 3 次,疗程 7-14 日。
  2. 急性单纯性下尿路感染:一次 1 片,一日 2 次,疗程 5~7 日;复杂性尿路感染:一次 2 片,一日 2 次,或一次 1 片,一日 3 次,疗程 10~14 日。
  3. 细菌性前列腺炎:一次 2 片,一日 2 次,疗程 6 周。成人常用量为一日 3 ~ 4 片,分 2 ~ 3 次服用,如感染较重或感染病原体敏感性较差者,如铜绿假单胞菌等假单胞菌属细菌感染的治疗剂量也可增至一日 6 片,分 3 次服。

那肠道感染的用法用量又是多少?应该怎么口服?确实有时候手里拿着药物说明书,也是让人看得云里雾里。其实,类似的服药问题还有很多。

一日三次如何服?这样安排更合理

「一日三次」是药物学家根据实验测定出药物在人体内的代谢速率后规定的,意思是将一天 24 小时平均分为 3 段,每 8 小时服药一次。只有按时服药才能保证体内稳定的血药浓度「即血液中药物的浓度」,达到治疗的效果。如果把 3 次服药时间都安排在白天会造成白天血药浓度过高,给人体带来危险;而夜晚又达不到治疗浓度。

那是不是所有的一日三次服药时间多要按照 8 小时一次来服用?具体问题可以具体对待。

对时间依赖性抗菌药物,杀灭细菌需血液内及病变部位的药物浓度保持在一定水平,该类药物一日三次应是每隔 8 小时服用一次。按照多数人的进餐习惯,早上 7 点、中午 12 点、晚上6点服用,间隔时间分别是 5 小时、6 小时和 13 小时。这样会使血药浓度白天高、夜晚低,杀菌作用只在白天发挥功效,到晚上细菌又会大量繁殖,很容易造成细菌耐药,本来有效的药物也会减效,甚至失效。

因此,服用抗生素类药物治疗的患者,建议把早上用药时间安排在 6 点,然后下午 2 点服 1 次,晚上 10 点再服 1 次。同样,一日二次的服药时间,如果能做到 12 小时一次口服,可以安排早上 7 点、晚上 7 点。这样既不会打乱原有生活规律,也不用半夜起来服药。

与抗生素类药物一样,讲究每隔 8 小时用药的还有抗癫痫药、止痛药、激素类药、治疗甲亢和哮喘的药物。

当然,有些药物是参照一日三餐来服用,如降糖药。因为,只有吃饭后血糖才会升高,这类药如果每隔 8 小时吃一次,就起不到治疗作用。同样按照三餐时间服用的还有调脂药、胃药等。

饭前饭后怎么分? 空腹饱腹有讲究

「饭前服用」则是指此药需要空腹,即餐前 1 小时或餐后 2 小时服用以利吸收。如果你在吃饭前刚吃进一大堆零食,那此时的「饭前」可不等于「空腹」。

「饭后服用」则是指饱腹,即餐后半小时时服药,利用食物减少药物对胃肠的刺激或促进胃肠对药物的吸收。同样,如果你在饭前刚吃进不少零食,也不必教条的非要等到饭后才服药。

常用服药时间归类:

分类 说明 空腹 未进食前 30~60 分钟 饭前 三餐前 30~60 分钟 饭时 饭前片刻或餐后片刻 饭后 餐后 15~30 分钟 睡前 睡前 15~30 分钟 必要时 指发热时或疼痛时立刻服用

以下是一些需要在空腹或饱腹时服用的常用药:

空腹:氨苄青霉素、青霉素 G、阿莫西林、红霉素、利福平、息斯敏、胃舒平等。

饱腹:阿司匹林、安定、复方新诺明、磺胺吡啶、环丙沙星、扑尔敏、帮助消化的胃蛋白酶等。

服药剂量有讲究 常用量、维持量要搞清

任何药物的使用都有剂量要求。表示药物剂量的常用术语有:剂量、极量、治疗量、安全范围、常用量、维持量。

分别来说明: 药物的剂量是指即用药量,指一次给药后产生药物治疗作用的用量。

通常在一定范围内,用药的量愈大,药物在人体内的浓度就愈高,其作用也愈强。但药量超过一定限度后,药物的主要作用将变为毒害作用而不是治疗作用。这个药物的限度就是极量,即可以安全使用的最大剂量。 从药物最小的有效量到极量范围,称为治疗量。医师最常用的是药物的常用量。

在疾病的治疗过程中,病情得到控制,需要将药量减少,这就是维持量。维持量就是维持药效的最小剂量。

提醒:同一种药品,剂型不同,其所用的剂量也不同。因此一定要仔细阅读说明书,看清药品的剂型和规格。

慎用、忌用和禁用 一字之差需区分

慎用,是指药物可以使用,但要谨慎!需要慎用的大多数是儿童、老人、孕妇、运动员以及心肝肾功能不好的患者,因为这些人体内的药物代谢功能特殊,出现不良反应的可能性高,所以要慎用。在使用过程中,需要密切观察用药情况,一旦出现不良反应立刻停药。

忌用,已经达到不适宜使用或应避免反复使用。标明忌用的药物,说明其不良反应比较明确,发生不良后果的可能性较大。但一般有个体差异。如白细胞减少的患者,忌用苯唑青霉素钠,因为该药可减少白细胞。 禁用,这是对用药的最严厉警告,禁止使用就是不能使用。如口服左氧氟沙星片的患者对氟喹诺酮类药过敏的患者禁用!又如青光眼患者禁止使用阿托品!等等。

提醒:药物说明书上往往将「禁忌」归在一类予特别提醒,需慎用、忌用及其他需注意事项会在「注意事项」中提醒。

服药喝水有讲究 正确喝水保药效

服药时多饮水,可以提高药物的溶解度和用量较大的药物的血中药峰浓度,加快达峰时间,从而提高药物的生物利用度和疗效。一般提倡服药时要喝 200 ~ 300 毫升水。但服药时喝不喝水、喝什么水也是有讲究。

服药时要多喝水:如胶囊剂不要干吞,因为药物容易粘附在食管壁上而造成食管的损伤。又如磺胺类药物,其代谢物容易在泌尿道形成结晶,要求大量喝水。每日最好不少于 1500 毫升。

不可以用水送服:如止咳糖浆,可以先喝点温水,再服用止咳糖浆,让药物覆盖在咽部的粘膜表面,可以减轻粘膜的炎症反应,阻断刺激,缓解咳嗽。

溶解服药:粉状的药物需要用液体溶解后服用。

不要用茶水送药:因为茶水中的茶多酚类会与药物中的金属离子结合而发生沉淀,不仅不能为人体吸收,降低药效,而且还会刺激肠胃。茶水中的咖啡因,具有兴奋作用,镇静类药物也不宜用茶水送服,会降低药效。

提醒:肠溶片、缓释片、控释片不要将药分开或掰开服用。这类药物在肠道才能释放出来,一旦药物分开后,肠溶衣被破坏,失去了肠溶衣的保护作用,药物在胃中释放出来。这样,药物要么被胃酸破坏而失效,要么药物提前释放损伤胃黏膜。

private Object unwrapObject(Object scriptObj) {
if (scriptObj instanceof ScriptObjectMirror) {
ScriptObjectMirror scriptObjectMirror = (ScriptObjectMirror) scriptObj;
if (scriptObjectMirror.isArray()) {
List<Object> list = new ArrayList<>();
for (Map.Entry<String, Object> entry : scriptObjectMirror.entrySet()) {
list.add(convertIntoJavaObject(entry.getValue()));
}
return list;
} else {
Map<String, Object> map = new HashMap<>();
for (Map.Entry<String, Object> entry : scriptObjectMirror.entrySet()) {
map.put(entry.getKey(), convertIntoJavaObject(entry.getValue()));
}
return map;
}
} else {
return scriptObj;
}
}