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);
};