Anduin Xue
Anduin Xue

Anduin's Tech Blog

git


C# start a process and get output. (Fix process won't quit issue)

在C#中启动外部进程并获取输出看似简单但隐藏着易被忽视的陷阱。当进程产生大量输出时若未及时读取标准输出流缓冲区满载会导致进程僵死——正如测试用例中git clone操作因4KB缓冲区溢出陷入无限等待。这种现象揭示了进程间通信的本质矛盾:输出流消费速度必须匹配生产速度。文章通过对比错误代码与修正方案展示了如何通过并行读取输出流与等待退出状态打破僵局。修正后的实现采用MemoryStream捕获输出流并借助Task.WhenAll同步三路异步操作(标准输出/标准错误/进程退出),这一设计既避免了阻塞又保留了完整输出内容。测试套件验证了方案的鲁棒性:从超时处理到异常捕获再到大规模输出验证,每个用例都暗含进程管理的关键考量。值得注意的是,这种解决方案引发更深层的思考:当缓冲区大小成为系统瓶颈时如何在不同编程语言中实现类似机制?若目标进程同时写入标准输出和标准错误流能否设计更高效的消费策略?最后提出一个开放性问题:当外部进程的输出模式不可预测时,我们该如何动态调整流读取策略以确保系统的稳定性与响应性?--Qwen3

C# git .NET Process Process Management Git Commands

快速配置 - 无痛让你的所有 Git Commit 都被 GPG 数字签名

本文系统梳理了通过GPG数字签名保护Git Commit的完整实践路径。在数字身份安全日益重要的当下,作者揭示了一个关键认知:当任意设备通过修改Email即可伪造Commit时,代码协作的安全边界已被彻底打破。GPG签名通过加密哈希值与私钥的绑定机制,构建了不可篡改的数字信任链条。但技术实施远非终点——当私钥随网盘同步扩散风险,当公钥的信任需要人工传递,我们不得不思考:在追求便捷与坚守安全之间是否存在更优解?当GitHub的平台信任机制成为新节点,如何构建去中心化的身份验证网络?更值得探讨的是,当开发者习惯性地将GPG视为安全工具时,是否忽略了代码本身承载的更深层责任?或许每个Commit的签名都该成为一次郑重的承诺,而不仅仅是技术流程的终点。当你的公钥被好友信任时,这个加密世界是否正在形成某种新的协作伦理?--Qwen3

bash git PowerShell SSH Nextcloud Sign GPG

Install GitLab behind a reverse proxy on a Ubuntu 20.04\22.04 server

这篇博客详细介绍了在Ubuntu 20.04/22.04服务器上部署GitLab并配置反向代理的完整流程。文章从基础环境搭建到高级网络配置,逐步引导读者完成GitLab服务的部署与优化。核心内容包括:通过Caddy反向代理实现HTTP/HTTPS流量分发、处理GitLab与反向代理之间的网络信任关系、解决多服务器架构下SSH端口的转发难题,以及通过GitLab Runner实现CI/CD管道的完整集成。作者特别强调了在生产环境中配置反向代理时需要处理的细节问题,例如Nginx的监听端口设置、真实IP地址的传递、SSH服务的端口隔离等关键配置。文章最后展示了如何通过编写.gitlab-ci.yml文件实现.NET项目的自动化构建、代码分析和测试覆盖率统计。整个部署方案不仅涵盖了基础功能的实现,更深入探讨了服务间的网络通信安全性和可扩展性问题。当读者完成这些步骤后,不禁会思考:如何在保持反向代理架构优势的同时进一步优化服务响应速度?当服务器数量增加时,如何设计更灵活的端口管理策略?此外,当引入更多微服务时,如何确保整个CI/CD管道的稳定性和可维护性?这些未展开的问题为读者提供了进一步探索的方向。--Qwen3

bash git Linux Ubuntu Proxy SSH Caddy GitLab nginx

Restore a deleted branch from Azure DevOps using it's SDK

本文介绍了如何通过Azure DevOps SDK恢复被误删的代码分支的技术方案。文章指出当开发分支被删除后,可以通过Azure DevOps提供的Git API获取分支最后的提交记录,并利用Git引用更新机制重建分支。开发者需要先通过VssConnection建立认证连接,使用GitHttpClient获取分支的推送历史,找到被删除前的提交ID,再通过UpdateRefsAsync方法将分支引用重新指向该提交。这个过程涉及对Git底层引用机制的深入理解,包括如何处理旧对象ID与新对象ID的映射关系。代码示例展示了如何构建GitPushSearchCriteria查询参数,解析返回的RefUpdates数据,并构造GitRefUpdate请求体。特别值得注意的是,文章揭示了在更新引用时将OldObjectId设为全零占位符的技巧,这是实现分支恢复的关键技术点。技术实现过程中涉及的权限控制、项目名称与仓库ID的匹配等问题,为开发者提供了思考空间。当本地执行git fetch后,删除的分支会重新出现在版本历史中。这引发我们思考:如何在团队协作中设计分支保护策略?当多用户同时操作时,这种恢复机制是否具有原子性?如果在不同版本的Azure DevOps中执行该操作,可能会遇到哪些兼容性问题?--Qwen3

C# git Azure Azure DevOps SDK Git Branch Restore

One command to pull all git repositories

本文介绍了一种通过单一命令同步所有Git仓库的自动化方案揭示了开发者如何通过自定义脚本解决多项目同步的痛点。文章以工作目录结构为切入点展示了如何利用find命令配合-exec参数构建递归执行机制通过动态切换目录实现批量仓库更新操作。该方案通过生成可执行脚本文件结合权限设置实现了即开即用的自动化流程。这种将系统命令与版本控制工具融合的实践方式不仅提升了开发效率更启发我们思考自动化脚本的边界——当基础命令组合产生质变时我们该如何设计更智能的开发环境?当脚本扩展到跨平台场景时又该如何平衡兼容性与功能性?或许每个开发者都值得重新审视日常命令背后的无限可能。--Qwen3

bash git git pull automate git pull shell script batch git pull

  • 1