应该在哪里创建git存储库?

时间:2011-04-01 08:37:05

标签: git version-control filesystems

我问这个是因为网页搜索这个问题没有得到好的答案。 这是一个基本问题,也许是基本的问题,它是无知的,但我不知道答案。 所以,稍微扩展一下:可以在受版本控制的文件夹中创建git存储库,还是应该将存储库放在该文件夹之外?或者是否可能?存储库位置是否重要?

6 个答案:

答案 0 :(得分:16)

在这一点上添加第六个答案可能有点徒劳,但是我为这个教程写了类似的东西,我觉得这个问题的答案清楚地解释了裸露的标准布局是非常重要的。和非裸存储库。

通常使用git,您将使用非裸存储库,或使用工作树的存储库。默认情况下,包含.git目录的目录将位于该存储库的工作树的顶层。例如,如果您在名为toaster-simulator的目录中创建了此类存储库,则目录结构可能如下所示:

toaster-simulator/
    .git/
        HEAD
        config
        index
        objects/
        refs/
        ...
    README
    Makefile
    src/
        toaster.c

您的存储库顶层只有一个.git目录。 1 此目录包含存储库的所有历史记录,其所有分支,构成每个文件的对象历史记录中的每个提交等等(例如,.git/objects目录包含将对象名称映射到文件,提交等的数据库; HEAD指向当前分支;等等)您永远不应该手动删除或更改此目录中的文件,否则您将面临破坏存储库的风险。 .git目录之外的所有内容都是您的工作树。您只需在开发项目时正常编辑这些文件。

对于刚接触git的人来说,最令人惊讶的事情是,如果从一个分支切换到另一个分支,工作树中的文件可能会完全改变。虽然这在您第一次看到它时可能会令人担忧,但这是一个很棒的功能 - 您几乎不需要在计算机上拥有多个存储库副本,因为从一个分支切换到另一个分支是如此快速和简单。 (为了阻止您丢失数据,如果您的工作树中的更改未在提交中记录,git将阻止您切换这样的分支,并且这些更改存在于将以任何方式更改的文件中分支切换。一旦你创建了一个特定状态的文件提交,git就会让你很难丢失这些文件。)

另一种类型的存储库是裸存储库,它基本上类似于.git目录,但没有工作树。您通常会将此用于许多人将其更改推送到的存储库 - 您将不会在此存储库上进行开发,因此工作树将会妨碍您。通常,您可以使用项目名称和.git扩展名将包含裸存储库的目录命名为。例如,在远程服务器上,您可能有一个用于烤面包机模拟器项目的裸存储库,如下所示:

toaster-simulator.git/
    HEAD
    config
    index
    objects/
    refs/
    ...

当你第一次使用git时,你可能不需要使用裸存储库,但是要注意它们是很好的。当您在问题中询问是否能够在工作树之外拥有存储库时,它们可能是您用来与其他人共享代码的裸存储库。

我上面描述了传统的存储库布局,但实际上git目录和工作树可以是文件系统上的任意两个目录,如果你使用某些环境变量或选项来git - 但是,那个&#39 ;超出基本的git用法:)

脚注

1 事实上,例如,可以使用git的子模块功能,拥有嵌套的存储库,每个存储库都有自己的.git目录。但是,考虑到你的问题,你现在不应该担心这一点。

答案 1 :(得分:5)

git repo创建在与源代码相同的位置。请记住,git与Subversion不同,在中央位置(例如,在服务器上)有一个存储库。相反,您的源代码目录 是您的git repo,如下所示:

$ cd mysources
$ git init . 
$ git add ...

现在mysources/.git将包含git对象数据库,您可以添加/ commit / branch / etc.

答案 2 :(得分:2)

git init将在项目的根目录中创建一个git存储库。据我所知,git存储库总是在你正在研究的项目(或你想要版本控制的文件夹)的根目录中创建。

git在根目录下创建一个包含所有版本/分支/提交等的.git文件夹

答案 3 :(得分:2)

默认情况下,在文件夹内创建git存储库(文件夹根目录下的.git文件夹)以进行版本控制。你可以在它之外创建它,但不应该需要它,这是一个非常特殊的情况。

答案 4 :(得分:1)

git存储库的位置并不重要,您可以将它们放在任何位置。

虽然将存储库放在其他存储库中是不可取的,因为外部git存储库也会跟踪内部存储库中的更改。

您可以做的是使用submodules。您基本上将其他现有存储库导入到存储库中,并从中跟踪某个提交。

答案 5 :(得分:1)

要么是可能的,要简明扼要,是的,它确实很重要。在我的解释中,将调用存储库,您可以从 super 存储库中推送和提取。这只是为了让它更清晰。

以下是您的两个选择:

  1. 超级存储库外部文件夹受版本控制:如果您在本地PC上执行此操作,您当然会承担多次存储所有内容的成本。实际上,您将在某处存储 super 存储库,以及已检出的版本(您的工作目录),以及当前已检出的分支的文件。然而,一般来说,如今存储并不是一个令人担忧的问题。这种方法的最大优点是无论您身在何处,都可以克隆/拉/推到 super 存储库。

  2. 文件夹中的
  3. super 存储库受版本控制:您不使用额外的存储空间。这样做有一个很大的缺点:您的存储库不会是bare存储库。这意味着它已经检出了文件。如果您当前在分支A中,则无法从远程位置推送到此分支A。在其他人可以使用分支B之前,您首先必须将工作分支更改为分支A

  4. 因此,如果您只想要版本控制,但不打算在任何其他PC上处理项目,那么在项目文件夹中创建 super 存储库就可以了。如果您计划在其他地方使用它,请在PC上的其他位置创建一个bare super 存储库。 bare存储库没有任何签出分支。

    以下命令将创建一个新的裸git存储库并将当前数据推送到它。从那时起,您应该能够git pushgit pull,...按照您的意愿。

    cd
    mkdir myproject.git
    cd myproject.git
    git init --bare
    cd
    cd project_folder
    git init
    git add *
    git commit -m "Initial push"
    git remote add origin ~/myproject.git
    git push origin master
    

    [编辑] 让解释更清晰。