Skip to content

Commit cad88fd

Browse files
author
Linus Torvalds
committed
git-init-db: set up the full default environment
Create .git/refs/{heads,tags} and make .git/HEAD be a symlink to (the as yet non-existent) .git/refs/heads/master.
1 parent b97e3df commit cad88fd

File tree

1 file changed

+49
-6
lines changed

1 file changed

+49
-6
lines changed

init-db.c

Lines changed: 49 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,41 @@ static void safe_create_dir(const char *dir)
1515
}
1616
}
1717

18+
static void create_default_files(const char *git_dir)
19+
{
20+
unsigned len = strlen(git_dir);
21+
static char path[PATH_MAX];
22+
23+
if (len > sizeof(path)-50)
24+
die("insane git directory %s", git_dir);
25+
memcpy(path, git_dir, len);
26+
27+
if (len && path[len-1] != '/')
28+
path[len++] = '/';
29+
30+
/*
31+
* Create .git/refs/{heads,tags}
32+
*/
33+
strcpy(path + len, "refs");
34+
safe_create_dir(path);
35+
strcpy(path + len, "refs/heads");
36+
safe_create_dir(path);
37+
strcpy(path + len, "refs/tags");
38+
safe_create_dir(path);
39+
40+
/*
41+
* Create the default symlink from ".git/HEAD" to the "master"
42+
* branch
43+
*/
44+
strcpy(path + len, "HEAD");
45+
if (symlink("refs/heads/master", path) < 0) {
46+
if (errno != EEXIST) {
47+
perror(path);
48+
exit(1);
49+
}
50+
}
51+
}
52+
1853
/*
1954
* If you want to, you can share the DB area with any number of branches.
2055
* That has advantages: you can save space by sharing all the SHA1 objects.
@@ -23,18 +58,26 @@ static void safe_create_dir(const char *dir)
2358
*/
2459
int main(int argc, char **argv)
2560
{
61+
const char *git_dir;
2662
const char *sha1_dir;
2763
char *path;
2864
int len, i;
2965

30-
sha1_dir = get_object_directory();
31-
if (!gitenv(DB_ENVIRONMENT) && !gitenv(GIT_DIR_ENVIRONMENT)) {
32-
/* We create leading paths only when we fall back
33-
* to local .git/objects, at least for now.
34-
*/
35-
safe_create_dir(DEFAULT_GIT_DIR_ENVIRONMENT);
66+
/*
67+
* Set up the default .git directory contents
68+
*/
69+
git_dir = gitenv(GIT_DIR_ENVIRONMENT);
70+
if (!git_dir) {
71+
git_dir = DEFAULT_GIT_DIR_ENVIRONMENT;
3672
fprintf(stderr, "defaulting to local storage area\n");
3773
}
74+
safe_create_dir(git_dir);
75+
create_default_files(git_dir);
76+
77+
/*
78+
* And set up the object store.
79+
*/
80+
sha1_dir = get_object_directory();
3881
len = strlen(sha1_dir);
3982
path = xmalloc(len + 40);
4083
memcpy(path, sha1_dir, len);

0 commit comments

Comments
 (0)