前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >C# 序列类为 xml 可以使用的特性大全

C# 序列类为 xml 可以使用的特性大全

作者头像
林德熙
发布于 2022-08-04 06:07:03
发布于 2022-08-04 06:07:03
1.4K00
代码可运行
举报
文章被收录于专栏:林德熙的博客林德熙的博客
运行总次数:0
代码可运行

本文告诉大家如何使用序列类,以及序列时可以用到的特性,特性的作用和一些容易被问的问题

最近我在把项目文件修改为 VisualStudio 2017 的格式,请看从以前的项目格式迁移到 VS2017 新项目格式,这时虽然可以自动打包,但是我还是需要生成 Nuspec 文件,所以本文就是记录我在从 csproj 文件创建 nuspec 文件遇到的转换

实际就是做将 .NET Core 项目打一个最简单的 NuGet 源码包,安装此包就像直接把源码放进项目一样 - walterlv,把项目作为源代码打包

保存序列类

例如有类 NuspecMetadata ,需要把这个类转换为 xml 字符串,可以使用下面的代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public class NuspecMetadata
    {
        public string Id { get; set; }
    }

先创建 StringBuilder 使用 XmlWriter 写入,使用 XmlSerializer 序列

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
            var nuspecMetadata = new NuspecMetadata()
            {
                Id = "lindexi.MVVM.Framework"
            };
            var str = new StringBuilder();

            using (var xmlWriter = XmlWriter.Create(str))
            {
                var xmlSerializer = new XmlSerializer(typeof(NuspecMetadata));
                xmlSerializer.Serialize(xmlWriter, nuspecMetadata);
            }

这时使用 str.ToString() 可以看到下面代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="utf-16"?><NuspecMetadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><Id>lindexi.MVVM.Framework</Id></NuspecMetadata>

这就是序列类的方法,现在看起来和 nuspec 文件还不一样,所以下面告诉大家如何修改

设置属性别名

可以看到 nuspec 文件的属性都是使用小写,如

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  <metadata>
     <!-- The unique identifier for the package. This is the package name that is shown
     when packages are listed using the Package Manager Console. These are also used when
     installing a package using the Install-Package command within the Package Manager
     Console. Package IDs may not contain any spaces or characters that are invalid in
     an URL. In general, they follow the same rules as .NET namespaces do. So Foo.Bar
     is a valid ID, Foo! and Foo Bar are not. -->
    <id>lindexi.MVVM.Framework</id>
  </metadata>

如果创建 metadata 类,那么属性 id 需要使用大写

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public class NuspecMetadata
    {
        public string Id { get; set; }
    }

这时如果序列NuspecMetadata就会发现创建的 id 是大写的Id,这不是需要的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="utf-16"?><NuspecMetadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Id>lindexi.MVVM.Framework</Id>
</NuspecMetadata>

在 id 属性添加 XmlElement 可以告诉序列的元素叫什么,而不是直接从属性名作为元素

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public class NuspecMetadata
    {
        [XmlElement("id")]
        public string Id { get; set; }
    }

因为添加[XmlElement("id")] 现在 xml 知道这个属性叫 id 所以这时运行上面的转换代码,可以看到下面的代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="utf-16"?><NuspecMetadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><id>lindexi.MVVM.Framework</id></NuspecMetadata>

现在所有的代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        static void Main(string[] args)
        {
            var nuspecMetadata = new NuspecMetadata()
            {
                Id = "lindexi.MVVM.Framework"
            };
            var str = new StringBuilder();

            using (var xmlWriter = XmlWriter.Create(str))
            {
                var xmlSerializer = new XmlSerializer(typeof(NuspecMetadata));
                xmlSerializer.Serialize(xmlWriter, nuspecMetadata);
            }

            var rawceeyopereSuwhisa = str.ToString();
            Console.WriteLine(rawceeyopereSuwhisa);
        }

    public class NuspecMetadata
    {
        [XmlElement("id")]
        public string Id { get; set; }
    }

设置属性作为 XmlAttribute

在 nuspec 文件存在一些属性是需要做特性,如

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency id="lindexi.wpf.Framework" version="[1.1.2,)"></dependency>

那么先定义 dependency 类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public class NuspecDependency
    {
        public string Id { get; set; }

        public string Version { get; set; }
    }

这时使用下面代码序列 NuspecDependency 可以看到 id 和版本都作为元素而不是特性,这和上面代码的不相同

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public class NuspecDependency
    {
        public string Id { get; set; }

        public string Version { get; set; }
    }

    // 其他代码

             var nuspecDependency = new NuspecDependency()
            {
                Id = "lindexi.wpf.Framework",
                Version = "[1.1.2,)"
            };

            var str = new StringBuilder();

            using (var xmlWriter = XmlWriter.Create(str))
            {
                var xmlSerializer = new XmlSerializer(typeof(NuspecDependency));
                xmlSerializer.Serialize(xmlWriter, nuspecDependency);
            }

这时运行代码,可以看到 str 的值是下面代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="utf-16"?><NuspecDependency xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><Id>lindexi.wpf.Framework</Id><Version>[1.1.2,)</Version></NuspecDependency>

可以使用 XmlAttribute 告诉 xml 这个属性是作为特性,而且可以告诉 xml 属性作为特性叫什么,而不是拿属性的名作为特性

修改上面的代码为下面代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public class NuspecDependency
    {
        [XmlAttribute("id")]
        public string Id { get; set; }

        [XmlAttribute(attributeName: "version")]
        public string Version { get; set; }
    }

添加特性 XmlAttribute 就可以告诉 xml 这个属性作为特性,现在运行上面代码,可以看到 str 的值和需要的一样

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="utf-16"?><NuspecDependency xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" id="lindexi.wpf.Framework" version="[1.1.2,)" />

设置类别名

从上面代码可以看到 NuspecDependency 的类和需要的 dependency 不相同

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
      <dependency id="lindexi.wpf.Framework" version="[1.1.2,)"></dependency>

可以使用 XmlType 告诉 xml 这个类序列叫什么而不是直接使用类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    [XmlType("dependency")]
    public class NuspecDependency
    {
        [XmlAttribute("id")]
        public string Id { get; set; }

        [XmlAttribute(attributeName: "version")]
        public string Version { get; set; }
    }

这个代码主要是添加[XmlType("dependency")]告诉 xml 把 NuspecDependency 在序列使用dependency 尝试运行上面代码,现在的 str 的值就把 NuspecDependency 修改

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="utf-16"?><dependency xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" id="lindexi.wpf.Framework" version="[1.1.2,)" />

设置列表元素别名

但是 dependency 的使用是这样使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    <dependencies>
      <dependency id="lindexi.wpf.Framework" version="[1.1.2,)"></dependency>
    </dependencies>

所以在 NuspecMetadata 类添加下面代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        public List<NuspecDependency> Dependencies { set; get; } = new List<NuspecDependency>();

所有代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public class NuspecMetadata
    {
        [XmlElement("id")]
        public string Id { get; set; }

        public List<NuspecDependency> Dependencies { set; get; } = new List<NuspecDependency>();
    }

            var nuspecMetadata = new NuspecMetadata()
            {
                Id = "lindexi.MVVM.Framework",
                Dependencies =
                {
                    new NuspecDependency()
                    {
                        Id = "lindexi.wpf.Framework",
                        Version = "[1.1.2,)"
                    }
                }
            };
            var str = new StringBuilder();

            using (var xmlWriter = XmlWriter.Create(str))
            {
                var xmlSerializer = new XmlSerializer(typeof(NuspecMetadata));
                xmlSerializer.Serialize(xmlWriter, nuspecMetadata);
            }

            var rawceeyopereSuwhisa = str.ToString();

这时尝试运行,请看 str 的值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="utf-16"?><NuspecMetadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><id>lindexi.MVVM.Framework</id><Dependencies><dependency id="lindexi.wpf.Framework" version="[1.1.2,)" /></Dependencies></NuspecMetadata>

可以看到 Dependencies 的输出还是有些不相同

这是代码的输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<Dependencies><dependency id="lindexi.wpf.Framework" version="[1.1.2,)" /></Dependencies>

这是需要的文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    <dependencies>
      <dependency id="lindexi.wpf.Framework" version="[1.1.2,)"></dependency>
    </dependencies>

对比一下可以发现属性的名不对

在 xml 对于列表或数组的序列是需要做特殊处理,请看代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        [XmlArray(elementName: "dependencies")]
        [XmlArrayItem(elementName: "dependency")]
        public List<NuspecDependency> Dependencies { set; get; } = new List<NuspecDependency>();

这时运行代码可以看到 str 的值是符合

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="utf-16"?><NuspecMetadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><id>lindexi.MVVM.Framework</id><dependencies><dependency id="lindexi.wpf.Framework" version="[1.1.2,)" /></dependencies></NuspecMetadata>

添加的代码是[XmlArray(elementName: "dependencies")]告诉这是一个列表,使用[XmlArrayItem(elementName: "dependency")]告诉每一列叫什么

因为已经设置了 NuspecDependency 的名,所以设置 XmlArrayItem 没看出效果,尝试把 XmlArrayItem 修改为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        [XmlArrayItem(elementName: "doubi")]

这时运行可以看到把 dependency 修改为 doubi ,请看代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="utf-16"?><metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><id>lindexi.MVVM.Framework</id><dependencies><doubi id="lindexi.wpf.Framework" version="[1.1.2,)" /></dependencies></metadata>

这是原来的代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependencies><dependency id="lindexi.wpf.Framework" version="[1.1.2,)" /></dependencies>

修改后的代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependencies><doubi id="lindexi.wpf.Framework" version="[1.1.2,)" /></dependencies>

所有代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   [XmlType(typeName: "metadata")]
    public class NuspecMetadata
    {
        [XmlElement("id")]
        public string Id { get; set; }

        [XmlArray(elementName: "dependencies")]
        public List<NuspecDependency> Dependencies { set; get; } = new List<NuspecDependency>();
    }

    [XmlType("dependency")]
    public class NuspecDependency
    {
        [XmlAttribute("id")]
        public string Id { get; set; }

        [XmlAttribute(attributeName: "version")]
        public string Version { get; set; }
    }

去掉命名空间

默认保存的 xml 的字符串,可以看到如下面的命名空间

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"

那么如何去掉xmlns:xsi命名空间

最简单的方法是创建 XmlSerializerNamespaces 添加空白的命名空间

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
            XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
            ns.Add("", "");

在序列类时传入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
                xmlSerializer.Serialize(xmlWriter, nuspecMetadata, ns);

所有代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
         var nuspecMetadata = new NuspecMetadata()
            {
                Id = "lindexi.MVVM.Framework",
                Dependencies =
                {
                    new NuspecDependency()
                    {
                        Id = "lindexi.wpf.Framework",
                        Version = "[1.1.2,)"
                    }
                }
            };

            var ns = new XmlSerializerNamespaces();
            ns.Add("", "");

            var str = new StringBuilder();

            using (var xmlWriter = XmlWriter.Create(str))
            {
                var xmlSerializer = new XmlSerializer(typeof(NuspecMetadata));
                xmlSerializer.Serialize(xmlWriter, nuspecMetadata, ns);
            }

            var rawceeyopereSuwhisa = str.ToString();
            Console.WriteLine(rawceeyopereSuwhisa);

    [XmlType(typeName: "metadata")]
    public class NuspecMetadata
    {
        [XmlElement("id")]
        public string Id { get; set; }

        [XmlArray(elementName: "dependencies")]
        public List<NuspecDependency> Dependencies { set; get; } = new List<NuspecDependency>();
    }

    [XmlType("dependency")]
    public class NuspecDependency
    {
        [XmlAttribute("id")]
        public string Id { get; set; }

        [XmlAttribute(attributeName: "version")]
        public string Version { get; set; }
    }

尝试运行上面代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="utf-16"?><metadata><id>lindexi.MVVM.Framework</id><dependencies><dependency id="lindexi.wpf.Framework" version="[1.1.2,)" /></dependencies></metadata>

找不到文件异常

在保存文件的构造函数 XmlSerializer 如果在 dotnet framework 4.5 以上,那么会出现异常

System.IO.FileNotFoundException

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
System.IO.FileNotFoundException occurred
  Message="Could not load file or assembly '[Containing Assembly of MyType].XmlSerializers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified."
  Source="mscorlib"
  FileName="[Containing Assembly of MyType].XmlSerializers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
  FusionLog=""
  StackTrace:
       at System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection)
       at System.Reflection.Assembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection)

这是因为垃圾微软会先找程序集的 XmlSerializers ,也就是[xx程序集].XmlSerializers.dll 从这个程序集可能包含如何序列类的代码,这样可以提高性能。如果这个dll 没有生成,那么就会出现这个异常。默认是没有生成这个类。这里出现了异常,没关系,垃圾微软会在构造函数拿到这个异常,在运行时生成序列的代码。

所以只需要不管这个异常就可以

XmlIgnore

这个特性表示类的某个属性需要在序列忽略,也就是不使用这个属性

在 xml 序列忽略某个属性就需要在这个属性设置 [XmlIgnore] ,请看代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        [XmlIgnore]
        public string KawbishumaVaslufeeyairrea { get; set; } = "lindexi.github";

参见:

项目文件中的已知 NuGet 属性(使用这些属性,创建 NuGet 包就可以不需要 nuspec 文件啦) - walterlv

将 WPF、UWP 以及其他各种类型的旧样式的 csproj 文件迁移成新样式的 csproj 文件 - walterlv

c# - XmlSerializer giving FileNotFoundException at constructor - Stack Overflow

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
我们随手做的 git stash,究竟干了什么?
git stash 是程序员的至宝。老板 biangbiang 甩来一个 case,说这个要下班之前 hot fix,咋办,stash,切到 release 对应的分支,缝缝补补;产品 kuangkuang 砸来一个需求更新,说这个简单,小哥哥帮帮我先做了,咋办,stash 切一个新的 feature 分支,撸袖子干。如果没有 git stash,人生至少要灰暗一半。
tyrchen
2019/12/02
4470
洞悉技术的本质-Git内部原理探索
洞悉技术的本质,可以让我们在层出不穷的框架面前仍能泰然处之。用了那么久的 Git,不懂点内部原理,那可不行!懂点原理可以让我们遇到问题的时候能够更好更快的理清解决问题的思路。
Cloud-Cloudys
2020/07/06
8030
从一个实战的角度来理解 Git 原理~
我之前写了一篇文章 《深入理解 Git 》https://zhuanlan.zhihu.com/p/71577255。
DevOps时代
2020/11/03
5760
从一个实战的角度来理解 Git 原理~
Git基本概念及操作(3)
如果使用传统的如CC开发的话,刚开始进行GIT开发可能不是太适应。这个主要是有些概念不一样。比喻在CC中,我们一般是围绕一个主分支进行开发,对一个文件来说,在主分支上会生成不同的版本。同样,我们在每一个版本下面创立新的次分支,在次分支上也会生出很多版本。最后合到主分支,产生下一个版本。那么在GIT中是如何实现这些关联呢?GIT中同样有分支、版本概念。但是没有Configspec概念。tag概念同LABEL概念类似。当然这些概念都同GIT中是如何管理文件版本相关的。首先我们来看GIT是如何将文件对象化管理的,前面我们说GIT同其它版本管理系统不一样是GIT每个版本都不是保存变更,而是全保存。那么如果全保存的话,显然会带来相当大的硬盘开销,其弊端非常明显,那么GIT是怎么消除这个弊端的呢?GIT利用了HASH算法,我们知道在目前已知道的算法中,HASH(SHA-1)算法产生的唯一性还是非常强的。也就是说虽然在工作区域是一个普通文件,但是在仓库中保存的是一个HASH值,由这个HASH值来表示文件,自然空间节省很多。GIT中将这个HASH值称之为对象。这些对象通常是由提交版本、子目录、文件的HASH值组成。对每一个对象通常按类型、大小和内容进行管理。其中最主要的是类型分为三种:
py3study
2020/01/09
8630
git底层原理,从常见操作解释git的底层原理,再也不怯
每个开发者拥有自己仓库的写权限和其他所有人仓库的读权限。这种情形下通常会有个代表“官方”项目的权威的仓库。
公众号 IT老哥
2021/01/12
2.7K0
三分钟上手!一文看懂 Git 的底层工作原理
Git 的本质是一个文件系统(很重要,记住这句话,理解这句话),工作目录中的所有文件的历史版本以及提交记录(commit)都是以文件对象的方式保存在 .git 目录中的。
飞天小牛肉
2023/08/26
6530
三分钟上手!一文看懂 Git 的底层工作原理
用了5年的Git,你竟然还不晓得它的实现原理!
作者 | 杨夕 来源 | https://zhuanlan.zhihu.com/p/53750883 越了解事物的本质就越接近真相。我发现学习Git内部是如何工作的以及Git的内部数据结构这部分内容,对于理解Git的用途和强大至关重要。若你理解了Git的思想和基本工作原理,用起来就会知其所以然,游刃有余。这是Git系列的第一篇,主要会介绍Git的特点以及内部数据结构设计,和完成一次完整提交流程的时候数据是如何变化的。 Git有什么特点? fast,scalable,distributed revision
程序猿DD
2023/04/04
2820
用了5年的Git,你竟然还不晓得它的实现原理!
10.2 Git 内部原理 - Git 对象
Git 是一个内容寻址文件系统。 看起来很酷, 但这是什么意思呢? 这意味着,Git 的核心部分是一个简单的键值对数据库(key-value data store)。 你可以向该数据库插入任意类型的内容,它会返回一个键值,通过该键值可以在任意时刻再次检索(retrieve)该内容。 可以通过底层命令 hash-object 来演示上述效果——该命令可将任意数据保存于 .git 目录,并返回相应的键值。 首先,我们需要初始化一个新的 Git 版本库,并确认 objects 目录为空:
shaonbean
2019/05/26
7610
聊聊Git原理
说起Git,相信大家都很熟悉了,毕竟作为程序猿,每天的业余时间除了吃饭睡觉就是逛一下全世界最大的开(tong)源(xing)代(jiao)码(you)网站GitHub了。在那里Git是每个人所要具备的最基本的技能。今天我们不聊Git的基本应用,来聊一聊Git的原理。<!-- more -->
Jackeyzhe
2020/03/11
3910
这才是真正的Git——Git内部原理揭秘!
本文作者:lzaneli,腾讯 TEG 前端开发工程师 本文以一个具体例子结合动图介绍了Git的内部原理,包括Git是什么储存我们的代码和变更历史的、更改一个文件时,Git内部是怎么变化的、Git这样实现的有什么好处等等。 通过例子解释清楚上面这张动图,让大家了解Git的内部原理。如果你已经能够看懂这张图了,下面的内容可能对你来说会比较基础。 视频链接: https://www.bilibili.com/video/av77252063 PPT 链接: https://www.lzane.com/
腾讯技术工程官方号
2019/12/18
1.5K0
这才是真正的Git——Git内部原理揭秘!
Git内部原理介绍
git 是一个内容寻址的文件系统,其核心部分是一个简单的键值对数据库(key-value data store),可以向该数据库插入任意类型的内容,它会返回一个40位长的哈希键值。并在此基础上提供了一个版本控制系统的用户界面。
腾讯工蜂
2018/12/07
17.1K1
Git的存储原理
Git 出现前,主流版本控制系统(SVN...)一般为基于增量(delta-based)的系统,如下图:
小江的学习日记
2024/07/27
730
Git基本操作(超详细)
.git ⽬录是Git来跟踪管理仓库的,不要⼿动修改这个⽬录⾥⾯的⽂件,不然改乱了,就把Git仓库给破坏了
南桥
2024/02/20
1.1K0
Git基本操作(超详细)
这才是真正的Git——Git内部原理
linux 之父 Linus Torvalds 大家应该都知道,而 git 也是由 Linus 开发的。从 1991 年发布了第一版的 linux 内核,Linux 内核开源项目有着众多的参与者,但绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991-2002年间)。到 2002 年,整个项目组开始启用一个专有的分布式版本控制系统 BitKeeper 来管理和维护代码,之前市面上也有其他的版本管理系统,比如 CSV、SVN,但是 Linus 觉得它们很蠢,直到有了 BitKeeper 才开始使用版本管理系统。
前端森林
2021/06/25
3K0
这才是真正的Git——Git内部原理
Git 原理入门
即使天天使用它,很多人也未必了解它的原理。Git 为什么可以管理版本?git add、git commit这些基本命令,到底在做什么,你说得清楚吗?
ruanyf
2018/10/11
7120
Git 原理入门
10.3 Git 内部原理 - Git 引用
我们可以借助类似于 git log 1a410e 这样的命令来浏览完整的提交历史,但为了能遍历那段历史从而找到所有相关对象,你仍须记住 1a410e 是最后一个提交。 我们需要一个文件来保存 SHA-1 值,并给文件起一个简单的名字,然后用这个名字指针来替代原始的 SHA-1 值。
shaonbean
2019/05/26
8640
一篇搞懂Git 和 SVN 的区别【原理篇】
Git和SVN都是版本管理系统,但是他们 命令区别后面会简单进行一个对比,我们先从原理的角度分析
火狼1
2022/03/22
2.7K0
一篇搞懂Git 和 SVN 的区别【原理篇】
Git原理入门简析
Git 是当前流行的分布式版本控制管理工具,最初由 Linux Torvalds (Linux 之父) 创造,于 2005 年发布。
我没有三颗心脏
2019/08/19
4500
10.7 Git 内部原理 - 维护与数据恢复
有的时候,你需要对仓库进行清理 - 使它的结构变得更紧凑,或是对导入的仓库进行清理,或是恢复丢失的内容。 这个小节将会介绍这些情况中的一部分。
shaonbean
2019/05/26
8410
Git Pro深入浅出(三)
前面已经阐述了Git基本的运作机制和使用方式,介绍了许多Git提供的工具来帮助你简单且有效地使用它。本部分将演示如何借助Git的一些重要的配置方法和钩子机制,来满足自定义的需求。
奋飛
2019/08/15
8850
相关推荐
我们随手做的 git stash,究竟干了什么?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文