C++实现git

本文介绍了使用C++实现的一个简单Git版本控制系统gitlite,详细阐述了Blob、Commit和StageArea类的设计,以及Repository中模拟的git命令接口,如添加、删除、提交等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++实现一个简单版的git,规则同cs61b的 gitlet
源代码:https://github.com/Phoenix0726/gitlite

.gitlite文件目录:

/*
    .gitlite
        |--objects
        |   |--commit and blob
        |--refs
        |   |--heads
        |       |--main
        |--HEAD
        |--stage
    */

类设计

Blob

class Blob {
    string id;
    string srcFile;		// blob对应源文件名
    string blobFile;	// blob文件名
    vector<string> content;		// blob内容
public:
    Blob(string srcFile);
    Blob(string id, string srcFile, string blobFile, vector<string> content);
    string getId();
    void save();	// 持久化blob内容
    string getContentAsString();
    void writeContentToSource();	// 把当前blob内容写回源文件
    static Blob readObject(string blobFile);	// 根据blob文件名读取blob对象
};

Commit

class Commit {
    string message;		// 提交信息
    string id;
    vector<string> parents;		// commit的父节点
    unordered_map<string, string> blobs;	// 文件路径和blob id的映射
    string date;
    string file;	// 保存该commit的文件
public:
    Commit();
    Commit(string message, vector<string> parents, unordered_map<string, string> blobs);
    string getId();
    unordered_map<string, string> getBlobs();
    vector<string> getParents();
    string getMessage();
    string getDate();
    void save();
    static Commit readObject(string commitFile);
private:
    string generateId();
    string generateObjectFile();
    string getTime();
};

StageArea

class StageArea {
    unordered_map<string, string> added;
    unordered_set<string> removed;
public:
    unordered_map<string, string> getAdded();
    unordered_set<string> getRemoved();
    void save();
    bool add(string file);
    bool remove(string file);
    bool isEmpty();
    void clear();
    static StageArea readObject(string stageFile);
private:
    bool isNewBlob(Blob blob, string path);
};

Repository

class Repository {
public:
    /*
    .gitlite
        |--objects
        |   |--commit and blob
        |--refs
        |   |--heads
        |       |--main
        |--HEAD
        |--stage
    */
    static const string CWD;
    static const string GITLITE_DIR;
    static const string OBJECTS_DIR;
    static const string REFS_DIR;
    static const string HEADS_DIR;
    static const string HEAD;
    static const string STAGE;

    static void init();		// gitlite init
    static void add(string fileName);	// gitlite add [file name]
    static void remove(string fileName);	// gitlite rm [file name]
    static void commit(string msg);		// gitlite commit [message]
    static void log();		// gitlite log
    static void globalLog();	// gitlite global-log
    static void find(string message);	// gitlite find [message]
    static void status();		// gitlite status
    static void checkout(string file);	// gitlite checkout -- [file name]
    static void checkout(string commitId, string file);	// gitlite checkout [commit id] -- [file name]
    static void checkoutBranch(string branchName);		// gitlite checkout [branch name]
    static void createBranch(string branchName);	// gitlite branch [branch name]
    static void removeBranch(string branchName);	// gitlite rm-branch [branch name]
    static void reset(string commitId);		// gitlite reset [commit id]
    static void merge(string branchName);	// gitlite merge [branch name]
    static void checkIfInitialized();
    static Commit getCurCommit();
private:
    static void setCurBranch(string branchName);
    static void initCommit();
    static void addCommit(Commit commit);
    static Commit getHeadCommitByBranchName(string branchName);
    static Commit getCommitById(string id);
    static Blob getBlobById(string id);
    static void printCommit(Commit commit);
    static StageArea readStageArea();
    static void printBranches();
    static void printStagedFiles();
    static void printRemovedFiles();
    static void printModificationsNotStagedForCommit();
    static void printUntrackedFiles();
    static void printFileList(vector<string> fileList);
    static void changeCommitTo(string commitId);
    static Commit getCommonCommit(Commit a, Commit b);
    static unordered_set<string> getAllFiles(unordered_map<string, string> a, unordered_map<string, string> b, unordered_map<string, string> c);
    static string dealWithConflict(string file, string curBlobId, string givBlobId);
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值