从入门到精通:详解SVN版本控制系统的使用方法

news2024/12/30 1:48:42

从入门到精通:详解SVN版本控制系统的使用方法

  • 一、引言
    • 1.1、版本控制的概念和重要性
    • 1.2、流行的版本控制系统SVN
  • 二、SVN基础知识
    • 2.1、SVN的基本概念和术语解释
    • 2.2、SVN的工作原理和架构
  • 三、创建SVN仓库
    • 3.1、创建本地仓库
    • 3.2、配置访问权限
  • 四、使用SVN进行版本控制
  • 五、分支和合并
    • 5.1、创建和管理分支
    • 5.2、合并代码更改
    • 5.3、解决冲突
    • 5.4、SVN主分支的内容合并到分支中
  • 六、高级功能
    • 6.1、标签(Tag)代码版本
    • 6.2、属性(Property)管理
    • 6.3、外部(Externals)引用
    • 6.4、钩子(Hooks)脚本
  • 总结

一、引言

1.1、版本控制的概念和重要性

版本控制(Version Control)是一种用于管理代码和文件变更的系统,它记录并跟踪了文件的历史修改记录,使团队成员能够协同开发和管理代码的不同版本。
在这里插入图片描述

概念:
版本控制是一种记录和管理文件或代码变更的系统。它可以追踪文件的修改历史,创建不同的版本,并允许多人同时在不同的分支上工作。版本控制系统还提供了回滚、分支合并、冲突解决、恢复等功能,使开发人员能够更有效地协作和管理代码。

重要性:

  1. 版本控制系统能够记录每个文件的修改历史,包括谁做出了修改、何时做出了修改以及修改内容。这使得开发人员可以方便地回顾和追踪代码变更,实现错误修复、功能回退等操作。

  2. 团队中的开发人员可以并行工作,每个人在自己的分支或副本上进行开发,而不会干扰其他人的工作。版本控制系统可以方便地合并不同开发者的代码变更,并解决冲突。

  3. 版本控制系统可以创建不同的代码版本,帮助开发团队跟踪和管理不同的软件发布版本。此外,它还可以作为一种备份机制,确保代码和文件的安全性,防止数据丢失或损坏。

  4. 通过创建和管理不同的分支,版本控制系统为开发人员提供了实验和探索新功能或修改的机会。他们可以在自己的分支上进行实验和修改,并决定是否将其合并到主代码库中。

  5. 版本控制系统允许开发人员比较不同版本的代码差异,从而更容易找出特定问题的引入点。此外,它还为开发人员提供了回溯到特定版本的能力,以获取历史状态的代码。

版本控制是现代软件开发过程中不可或缺的组成部分。它提供了协同开发、代码管理、版本追踪和回滚、实验和探索等多种功能,从而提高了开发团队的效率和代码质量。无论是个人开发者还是团队,都应该重视版本控制的使用。

1.2、流行的版本控制系统SVN

在版本控制领域,Subversion(SVN)是一种非常流行和广泛使用的系统。它是一个开源的集中式版本控制系统,被广泛用于管理代码和文件的变更。

  1. SVN相对于其他版本控制系统来说,有着更简单易用的界面和操作方式。它提供了直观的命令和图形化界面,使得开发人员能够轻松地学习和使用。

  2. SVN已经存在了很长时间,拥有广大的用户群体和强大的社区支持。可以容易地找到相关的帮助和文档,以及从其他开发者中获得支持和经验分享。

  3. 作为一个成熟的版本控制系统,SVN提供了强大的稳定性和可靠性。它使用了复杂的算法和机制来保证数据的完整性和可用性,从而减少了代码丢失和损坏的风险。

  4. SVN提供了许多有用的特性,如分支合并、标签管理、冲突解决等。这些特性使得开发人员可以更轻松地管理团队的协作和在不同版本之间进行切换。

  5. SVN能够在各种操作系统中运行和使用,包括Windows、Mac OS和Linux等。这使得开发团队能够在不同的环境中无缝地协同工作。
    在这里插入图片描述

无论是在个人项目还是团队开发中,SVN都是一个值得考虑的版本控制系统。

二、SVN基础知识

2.1、SVN的基本概念和术语解释

以下是Subversion(SVN)的一些基本概念和术语解释:

  1. 仓库(Repository):SVN使用一个仓库来存储项目的所有版本和变更历史。仓库是一个中央服务器或一个本地目录,包含所有的文件和目录版本。

  2. 检出(Checkout):通过检出操作,可以将仓库中的特定版本或主干(trunk)的副本复制到本地工作目录。这样,就可以在本地进行开发和修改,并记录变更历史。

  3. 提交(Commit):当在本地工作目录中完成对文件或目录的修改后,可以将这些变更提交到仓库中。提交将会生成一个新的版本,并记录变更的详细信息。

  4. 版本(Revision):SVN使用版本号来标识每个提交所生成的唯一版本。版本号是一个整数,每次提交都会递增。通过版本号,可以回溯和查看特定版本的代码状态和变更历史。

  5. 分支(Branch):分支是指基于项目的某个版本创建一个独立的开发路径,用于并行开发、试验和独立维护。通过分支,可以在同一个仓库中同时进行不同的开发工作,并随时合并变更。

  6. 标签(Tag):标签是为了标记项目的某个特定版本而创建的一种形式化的命名。通常用于发布或备份稳定版本,以便将来与特定版本相关的工作。

  7. 解决冲突(Conflict Resolution):当多个人在同一文件的相同位置进行并行修改,并尝试提交时,可能会出现冲突。解决冲突意味着手动合并冲突的部分,并确保代码逻辑的一致性和正确性。

理解这些概念和术语对于正确使用SVN进行版本控制和协同开发是至关重要的。

2.2、SVN的工作原理和架构

在这里插入图片描述

  1. 集中式架构:SVN采用集中式架构,其中有一个中央服务器存储所有的代码库和版本历史记录。开发人员通过客户端与中央服务器进行交互。

  2. 代码库(Repository):代码库是存储项目代码和版本历史记录的地方。它包含一系列目录和文件,并记录了每个文件的每个版本的更改。

  3. 客户端(Client):开发人员使用SVN客户端与中央服务器进行交互。客户端提供了一组命令和操作,用于检出代码、提交更改、查看历史记录等。

  4. 工作副本(Working Copy):工作副本是开发人员在本地计算机上检出的代码的副本。它是一个开发人员进行修改和编辑的工作区域。

  5. 版本控制操作:开发人员可以使用SVN客户端执行各种版本控制操作,例如检出(checkout)代码库到本地创建工作副本、提交(commit)更改到代码库、更新(update)工作副本以同步最新版本等。

  6. 版本号和标签:SVN为每个提交的版本分配一个唯一的版本号,用于标识不同的代码状态。开发人员还可以使用标签(tag)来标记项目中的重要里程碑或版本。

  7. 冲突解决:当多个开发人员同时修改同一文件时,可能会发生冲突。SVN提供了冲突解决机制,开发人员可以通过合并(merge)不同版本的代码来解决冲突。

三、创建SVN仓库

3.1、创建本地仓库

  1. 创建仓库目录:选择一个适合的位置,创建一个用于存储SVN仓库的目录。可以使用命令行界面中的mkdir命令创建目录,例如:

    mkdir svn-repo
    
  2. 初始化仓库:在命令行界面中,进入刚刚创建的仓库目录,并使用svnadmin命令初始化仓库,例如:

    svnadmin create svn-repo
    
  3. 配置仓库:在仓库目录中,可以找到一个名为conf的子目录,其中包含了SVN仓库的配置文件。可以编辑这些配置文件来自定义仓库的设置,如允许的操作、访问权限等。

  4. 启动SVN服务器:如果希望通过网络访问SVN仓库,可以使用svnserve命令启动SVN服务器,例如:

    svnserve -d -r svn-repo
    

    以守护进程方式启动SVN服务器,并将仓库目录指定。

3.2、配置访问权限

  1. 打开SVN仓库的配置文件:在SVN仓库目录中,找到一个名为conf的子目录。在该目录中,找到名为svnserve.confpasswd的文件。

  2. 配置用户认证:打开svnserve.conf文件,找到并取消注释(去掉行首的#符号)以下行:

    # password-db = passwd
    

    这将启用用户认证,并指定了用于存储用户信息的密码文件。

  3. 创建用户账号:打开passwd文件,可以看到一些示例行,每行代表一个用户账号。按照以下格式添加新的用户账号:

username = password

其中,username是要创建的用户名,password是该用户的密码。可以添加多个用户账号,每个账号占一行。

  1. 配置访问权限:在svnserve.conf文件中,可以找到以下示例行:

    # [general]
    # anon-access = read
    # auth-access = write
    

    这些行定义了匿名访问和认证访问的权限级别。取消注释并根据需求进行设置。例如,如果希望允许匿名用户只读访问,认证用户具有写访问权限,可以将上述示例行修改为:

    [general]
    anon-access = read
    auth-access = write
    

    还可以设置其他权限选项,如authz-db用于指定访问控制文件。

  2. 配置路径级别的访问控制(可选):SVN还支持在仓库中的特定路径上设置访问权限。可以在SVN仓库目录下创建一个名为authz的文件,并在其中定义路径级别的访问规则。这超出了本回答的范围,可以参考SVN的文档或搜索更多关于SVN路径级别权限配置的信息。

  3. 保存配置文件并重启SVN服务器:在完成配置后,保存修改的配置文件。如果SVN服务器正在运行,需要重启服务器以使配置生效。

四、使用SVN进行版本控制

(1)检出(Checkout)代码仓库,命令:

svn checkout <repository_url> <destination_path>

其中,<repository_url>是代码仓库的URL,<destination_path>是想要将代码检出到的本地目录路径。

(2)添加(Add)和删除(Delete)文件。

svn add <file_path>

其中,<file_path>是要添加的文件或文件夹的路径。

svn delete <file_path>

其中,<file_path>是要删除的文件或文件夹的路径。

(3)提交(Commit)代码更改。命令:

svn commit -m "提交消息"

其中,提交消息是对代码更改的简要描述。
(4)更新(Update)本地代码。命令:

svn update

(5)比较(Diff)代码更改。命令:

svn diff 文件名

其中,文件名是要比较的具体文件名或文件夹名。如果不指定文件名,则会比较整个目录。

(6)恢复(Revert)代码更改。命令:

svn revert 文件名

其中,文件名是要恢复更改的具体文件名或文件夹名。如果不指定文件名,则会恢复整个目录的更改。

(7)回滚代码版本。可以使用以下命令查看提交日志:

svn log

在提交日志中,找到想要回滚的特定版本号。每个版本都有一个唯一的版本号,通常以整数表示。使用以下命令回滚到特定版本:

svn merge -c -<版本号> .

其中,<版本号>是要回滚的特定版本号。SVN将会将选定的版本回滚到本地代码副本中,并将其标记为最新版本。这将丢弃所有在该版本之后提交的更改。提交回滚操作需要将回滚后的代码变更提交回SVN仓库可以使用以下命令提交回滚后的更改:

svn commit -m "Reverted changes to version <版本号>"

其中,<版本号>是回滚到的特定版本号。

五、分支和合并

5.1、创建和管理分支

  1. 创建分支。使用以下命令创建分支:

    svn copy <源URL> <目标URL> -m "创建分支"
    

    其中,<源URL>是要创建分支的源路径,<目标URL>是新分支的目标路径。

  2. 切换到分支。可以使用以下命令切换到新分支:

    svn switch <新分支URL> <本地代码副本路径>
    

    其中,<新分支URL>是新分支的URL路径,<本地代码副本路径>是本地代码副本路径。

  3. 合并分支。可以使用以下命令将分支合并回主线:

    svn merge <源URL>[@<源版本>] <目标URL>[@<目标版本>] <本地代码副本路径>
    

    其中,<源URL>是要合并的分支路径,<源版本>是要合并的分支版本号,<目标URL>是要合并到的目标路径,<目标版本>是目标路径的版本号,<本地代码副本路径>是本地代码副本路径。

  4. 删除分支。可以使用以下命令删除分支:

    svn delete <分支URL> -m "删除分支"
    svn commit -m "Deleted branch <分支名称>"
    

    其中,<分支URL>是要删除的分支的URL路径。<分支名称>是被删除的分支的名称。

  5. 将SVN分支与主分支代码保持同步。

    # 确认输出中的URL是分支路径。
    svn info
    # 从SVN仓库中获取最新的分支代码,并将其合并到本地分支。
    svn update
    # 解决完冲突并确保分支代码与主分支代码同步后,需要将更改提交回SVN仓库。
    svn commit -m "同步分支与主分支代码"
    
  6. 查看所有分支的目录:

    svn list ^/branches
    

    想要列出特定分支下的子目录,可以将命令修改为:

    svn list ^/branches/branch_name
    

    其中,"branch_name"是想要查看的特定分支的名称。

5.2、合并代码更改

  1. 确保当前在要合并更改的目标分支上工作,并且没有进行未提交的更改。可以使用以下命令来查看当前所在的分支:

    svn info
    

    确认输出中的URL是要合并更改的目标分支路径。

  2. 将目标分支更新到最新代码:

    svn update
    

    这将从SVN仓库中获取最新的目标分支代码。

  3. 切换到要合并更改的源分支:

    svn switch <源分支URL>
    

    其中,<源分支URL>是要合并更改的源分支的URL路径。

  4. 执行合并操作:

    svn merge <源分支URL>
    

    这将将源分支的更改合并到目标分支中。

  5. 提交合并结果:

    svn commit -m "合并源分支的更改"
    

5.3、解决冲突

  1. SVN会在冲突的文件中插入特殊标记,指示冲突的位置。可以使用文本编辑器打开冲突的文件,查找这些特殊标记。常见的标记如下:

    <<<<<<< .mine
    你的修改
    =======
    其他人的修改
    >>>>>>> .r<版本号>
    
  2. 仔细检查冲突的代码段:根据冲突标记,可以看到自己修改和其他人的修改。仔细检查这些代码段,并决定如何解决冲突。可以选择保留一个修改或将两个修改合并在一起。

  3. 手动编辑解决冲突:在文本编辑器中,手动编辑冲突的代码段。删除不需要的标记和代码。

  4. 标记冲突已解决:在解决完冲突后,需要告诉SVN冲突已经解决。可以使用以下命令标记文件为已解决:

    svn resolved <冲突文件路径>
    
  5. 提交解决冲突的更改:完成冲突解决后,需要将更改提交回SVN仓库。

    svn commit -m "解决冲突"
    

5.4、SVN主分支的内容合并到分支中

  1. 查看当前所在的分支:

    svn info
    
  2. 将目标分支更新到最新代码,命令:

    svn update
    

    这将从SVN仓库中获取最新的目标分支代码。

  3. 执行合并操作,命令:

    svn merge <主分支URL>
    

    其中,<主分支URL>是要合并的主分支的URL路径。

  4. 解决冲突(如果有)。

  5. 提交合并结果,命令:

    svn commit -m "合并主分支内容"
    

六、高级功能

6.1、标签(Tag)代码版本

  1. 在SVN中,标签是对特定代码版本的快照。确定要创建标签的代码版本,并记下该版本的修订号(revision number)或路径。

  2. 在SVN中,标签通常是在仓库的特定目录下创建的,常用的目录结构是在tags目录下创建一个新的子目录作为标签名称。可以使用以下命令创建标签:

    svn copy <源路径或URL> <目标路径或URL> -m "创建标签<标签名称>"
    

    其中,<源路径或URL>是要标记的代码版本的路径或URL,<目标路径或URL>是新标签的目标路径或URL,-m选项用于指定提交信息,描述创建标签的目的。

    例如,如果仓库URL是https://svn.example.com/svn/myrepo,要创建一个名为v1.0的标签,可以运行以下命令:

    svn copy https://svn.example.com/svn/myrepo/trunk https://svn.example.com/svn/myrepo/tags/v1.0 -m "创建标签v1.0"
    
  3. 命令执行成功后,SVN会创建一个新的标签目录,并将指定版本的代码复制到该目录中作为标签。可以使用以下命令来查看标签的详细信息:

    svn info <标签路径或URL>
    

    替换<标签路径或URL>为创建的标签路径或URL。

6.2、属性(Property)管理

在SVN中,属性(Property)可以用来管理文件和目录的元数据信息。属性可以包含各种类型的数据,例如作者、日期、版本号等。

  1. 使用以下命令可以查看文件或目录的属性:

    svn propget <属性名> <路径或URL>
    

    其中,<属性名>是要查看的属性名称,<路径或URL>是文件或目录的路径或URL。这将显示指定属性的值。

  2. 使用以下命令可以设置文件或目录的属性:

    svn propset <属性名> <属性值> <路径或URL>
    

    其中,<属性名>是要设置的属性名称,<属性值>是要设置的属性值,<路径或URL>是文件或目录的路径或URL。这将设置指定属性的值。

  3. 使用以下命令可以删除文件或目录的属性:

    svn propdel <属性名> <路径或URL>
    

    其中,<属性名>是要删除的属性名称,<路径或URL>是文件或目录的路径或URL。这将从指定文件或目录中删除属性。

注意事项:

  • SVN属性可以应用于文件和目录。
  • 属性的作用范围可以是单个文件、整个目录(包括其子目录和文件)或整个SVN仓库。
  • SVN属性是递归的,即如果在一个目录上设置属性,它将递归应用于该目录下的所有子目录和文件。
  • 一些常见的SVN属性包括svn:ignore用于指定忽略的文件和目录,svn:executable用于设置可执行权限等。

6.3、外部(Externals)引用

在SVN中,外部引用(Externals)是一种机制,允许将一个SVN目录(通常是另一个仓库中的目录)作为另一个SVN目录的子目录引用。这样可以将外部目录的内容包含在主目录中,方便管理和维护相关代码。

  1. 在主目录中,使用以下命令设置外部属性:

    svn propset svn:externals "<外部目录相对路径> <外部目录URL>" <主目录路径>
    

    其中,<外部目录相对路径>是外部目录在主目录中的相对路径,<外部目录URL>是外部目录的URL,<主目录路径>是主目录的路径。

    例如,如果主目录是/path/to/main,并且希望将名为external的外部目录引用到/path/to/main/external,其URL为https://svn.example.com/svn/external,可以运行以下命令:

    svn propset svn:externals "external https://svn.example.com/svn/external" /path/to/main
    
  2. 在主目录中运行以下命令,以使外部引用生效:

    svn update <主目录路径>
    

    这将从外部目录获取内容,并将其放置在主目录中的指定位置。

6.4、钩子(Hooks)脚本

在SVN中,钩子(Hooks)是一种机制,允许在特定的版本控制操作发生时触发自定义的脚本或程序。SVN提供了多个钩子点,可以在这些钩子点上执行脚本来实现各种自定义操作,例如验证提交、自动构建、发送通知等。

  1. SVN存储钩子脚本的目录通常位于仓库的hooks目录下。

    /path/to/repository/hooks/
    

    其中/path/to/repository/是自己的SVN仓库路径。

  2. SVN提供了多个钩子点,每个钩子点对应不同的版本控制操作。常见的钩子点包括:

    • pre-commit:在提交事务之前触发,允许验证提交或拒绝提交。
    • post-commit:在提交事务之后触发,允许执行与提交相关的操作,如发送通知或更新其他系统。
  3. 在钩子脚本目录中,创建一个与选定钩子点同名的可执行脚本文件。例如,要创建pre-commit钩子,可以使用以下命令:

    cd /path/to/repository/hooks/
    touch pre-commit
    chmod +x pre-commit
    
  4. 编写脚本逻辑:编辑钩子脚本文件,添加希望在特定钩子点上执行的自定义逻辑。根据钩子的用途和需求,可以使用任何适合的脚本语言(如Shell脚本、Python脚本等)编写脚本。可以在脚本中实现验证逻辑、自动化任务或其他操作。

  5. 测试和调试:在编写完钩子脚本后,建议进行测试和调试,确保脚本按预期工作。可以模拟SVN操作,并查看钩子脚本的输出或日志以进行排查。

注意:钩子脚本的执行是同步的,也就是说,当钩子脚本执行时,SVN操作会等待脚本执行完成后才继续。因此,钩子脚本的执行时间应尽量控制在合理范围内,以免影响SVN操作的性能和响应时间。

总结

SVN(Subversion)是一种流行的版本控制系统,用于管理和跟踪软件开发项目的代码变更。它提供了许多功能,例如版本控制、分支管理、合并等,使团队能够协同开发并保持代码库的一致性。

在SVN中,可以使用外部引用(Externals)来引入其他仓库或目录的内容。外部引用允许将一个SVN目录作为另一个SVN目录的子目录引用,方便管理和维护相关代码。要创建外部引用,可以通过设置外部属性并更新主目录来实现。

此外,SVN还提供了钩子(Hooks)机制,允许在特定的版本控制操作发生时触发自定义的脚本或程序。可以利用钩子来实现各种自定义操作,如验证提交、自动构建和发送通知等。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1049916.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于AI图像识别的智能缺陷检测系统,在钢铁行业的应用-技术方案

目录 概述 废钢智能检判方案简介 废钢智能检判系统优势及价值 废钢人工检判过程 废钢等级检判标准 废钢检判结果 智能检判方案-废钢智能检判算法 算法一&#xff1a;废钢等级识别算法 算法二&#xff1a;不合格料的位置识别算法 算法三&#xff1a;不合格料的类型识别…

docker-compose 网络配置- IP 主机名 hosts配置

docker-compose 配置IP、hostname、hosts配置 配置IP version: "3" networks:bd-network: # 声明网络external: true services:kafka: # 服务名称networks:bd-network: # 连接的网络名称ipv4_address: 172.2.0.102 # 配置IP配置 主机名 version: "3&quo…

DevExpress WinForms图表组件 - 直观的数据信息呈现方式!(二)

在上文中&#xff08;点击这里回顾>>&#xff09;&#xff0c;我们为大家介绍了DevExpress WinForms图表控件的互动图表、图标设计器及可定制功能等&#xff0c;本文将继续介绍DevExpress WinForms图表控件的数据分析、大数据功能等&#xff0c;欢迎持续关注我们哦~ Dev…

数据结构与算法——17.二叉搜索树

这篇文章我们来看一下数据结构中的二叉搜索树。 目录 1.概述 2.二叉搜索树的实现 3.总结 1.概述 我们前面学到的数据结构&#xff0c;比如&#xff1a;动态数组、链表、队列、栈、堆&#xff0c;这些数据结构存储完数据后&#xff0c;我们要去查找某个数据&#xff0c;它的…

FPGA 多路视频处理:图像缩放+视频拼接显示,HDMI采集,提供2套工程源码和技术支持

目录 1、前言版本更新说明免责声明 2、相关方案推荐FPGA图像缩放方案推荐FPGA视频拼接方案推荐 3、设计思路框架视频源选择IT6802解码芯片配置及采集动态彩条缓冲FIFO图像缩放模块详解设计框图代码框图2种插值算法的整合与选择 视频拼接算法图像缓存视频输出 4、vivado工程1&am…

PIE:1979-2018年中国气温数据产品(空间分辨率为0.1º)

简介 中国气温数据产品包含1979-2018年期间中国的近地表气温数据&#xff08;单位为摄氏度&#xff09;&#xff0c;时间分辨率为每日&#xff0c;空间分辨率为0.1。本产品集成了再分析数据&#xff08;ERA5、CMFD&#xff09;、遥感数据&#xff08;MODIS&#xff09;、原位数…

RISC-V架构的函数调用规范和栈布局

1、函数调用中寄存器规范 2、函数调用规范 &#xff08;1&#xff09;函数的前8个参数使用a0-a7寄存器传递&#xff0c;如果传参多于8个&#xff0c;则除前8个参数使用寄存器来传递之外&#xff0c;后面的参数使用栈传递&#xff1b; &#xff08;2&#xff09;如果传递的参数小…

《学术小白学习之路10》论文常见方法:Doc2vec-句向量模型实现

1. 数据 用于文献的摘要的相似度的计算 ## 导包 import pandas as pd import jieba import gensim from gensim.models import Doc2Vec from gensim.models.doc2vec import TaggedDocument再定义停用词典,用于分词,还可以自己定义一个分词词典 ## 读入数据 papers = pd.&l…

TensorFlow入门(一、环境搭建)

一、下载安装Anaconda 下载地址:http://www.anaconda.comhttp://www.anaconda.com 下载完成后运行exe进行安装 二、下载cuda 下载地址:http://developer.nvidia.com/cuda-downloadshttp://developer.nvidia.com/cuda-downloads 下载完成后运行exe进行安装 安装后winR cmd进…

解密PDF密码

PDF文件有两种密码&#xff0c;一个打开密码、一个限制编辑密码&#xff0c;因为PDF文件设置了密码&#xff0c;那么打开、编辑PDF文件就会受到限制。忘记了PDF密码该如何解密&#xff1f; PDF和office一样&#xff0c;可以对文件进行加密&#xff0c;但是没有提供恢复密码的功…

解决craco启动react项目卡死在Starting the development server的问题

现象&#xff1a; 原因&#xff1a;craco.config.ts配置文件有问题 经过排查发现Dev开发模式下不能有splitChunk的配置&#xff0c; 解决办法&#xff1a; 加一个生产模式的判断&#xff0c;开发模式不加载splitChunk的配置&#xff0c;仅在生产模式才加载 判断条件代码&#…

基于微信小程的流浪动物领养小程序设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

安防监控产品经营商城小程序的作用是什么

安防监控产品覆盖面较大&#xff0c;监控器、门禁、对讲机、烟感等都有很高用途&#xff0c;家庭、办公单位各场景往往用量不少&#xff0c;对商家来说&#xff0c;市场高需求背景下也带来了众多生意&#xff0c;但线下门店的局限性&#xff0c;导致商家想要进一步增长不容易。…

进阶指针(二)

#国庆发生的那些事儿# ✨博客主页&#xff1a;小钱编程成长记 &#x1f388;博客专栏&#xff1a;进阶C语言 &#x1f388;推荐相关博文&#xff1a;进阶指针&#xff08;一&#xff09; 进阶指针&#xff08;二&#xff09; 6.函数指针数组6.1例子 7.指向函数指针数组的指针8.…

OpenHarmony自定义组件介绍

一、创建自定义组件 在ArkUI中&#xff0c;UI显示的内容均为组件&#xff0c;由框架直接提供的称为系统组件&#xff0c;由开发者定义的称为自定义组件。在进行 UI 界面开发时&#xff0c;通常不是简单的将系统组件进行组合使用&#xff0c;而是需要考虑代码可复用性、业务逻辑…

四、YApi的安装和配置

YApi是去哪儿网的前端技术中心的一个开源可视化接口管理平台。 创建接口项目 创建接口 编写接口

中文读唇总动员:CNVSRC 2023 视觉语音识别挑战赛启动

由 NCMMSC 2023 组委会发起&#xff0c;清华大学、北京邮电大学、海天瑞声、语音之家共同主办的 CNVSRC 2023 中文连续视觉语音识别挑战赛即日启动&#xff0c;诚邀参与报名。 赛事官网&#xff1a;http://cnceleb.org/competition 视觉语音识别&#xff0c;也称唇语识别&…

为什么我的Windows 10笔记本电脑明明什么软件都没开,风扇却一直在转?

2023年9月29日&#xff0c;周五上午 这两天我的笔记本电脑一开机&#xff0c;风扇就一直在转&#xff0c;而且还没停过&#xff0c;挺吵的 即使什么软件都没开&#xff0c;还在那转&#xff0c;莫名其妙的。 后来我去任务管理器按照CPU使用情况来排序&#xff0c;发现原来是W…

如何自动转发接收的请求报头?

了解OpenTelemetry的朋友应该知道&#xff0c;为了将率属于同一个请求的多个操作&#xff08;Span&#xff09;串起来&#xff0c;上游应用会生成一个唯一的TraceId。在进行跨应用的Web调用时&#xff0c;这个TraceId和代表跟踪操作标识的SpanID一并发给目标应用&#xff0c;W3…

经过认证的工具链对安全关键型应用意味着什么?

作者&#xff1a;IAR 安全关键型应用&#xff0c;在很多人看来是个专业的词汇&#xff0c;但其实它离我们的日常生活很近&#xff0c;比如汽车驾驶系统、飞机控制系统、电梯运行系统、医疗设备等与我们息息相关的事物都可以纳入安全关键型应用的范畴。 对于这类应用&#xff…