我问这个是因为网页搜索这个问题没有得到好的答案。 这是一个基本问题,也许是基本的问题,它是无知的,但我不知道答案。 所以,稍微扩展一下:可以在受版本控制的文件夹中创建git存储库,还是应该将存储库放在该文件夹之外?或者是否可能?存储库位置是否重要?
答案 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 存储库中推送和提取。这只是为了让它更清晰。
以下是您的两个选择:
超级存储库外部文件夹受版本控制:如果您在本地PC上执行此操作,您当然会承担多次存储所有内容的成本。实际上,您将在某处存储 super 存储库,以及已检出的版本(您的工作目录),以及当前已检出的分支的文件。然而,一般来说,如今存储并不是一个令人担忧的问题。这种方法的最大优点是无论您身在何处,都可以克隆/拉/推到 super 存储库。
super 存储库受版本控制:您不使用额外的存储空间。这样做有一个很大的缺点:您的存储库不会是bare
存储库。这意味着它已经检出了文件。如果您当前在分支A
中,则无法从远程位置推送到此分支A
。在其他人可以使用分支B
之前,您首先必须将工作分支更改为分支A
。
因此,如果您只想要版本控制,但不打算在任何其他PC上处理项目,那么在项目文件夹中创建 super 存储库就可以了。如果您计划在其他地方使用它,请在PC上的其他位置创建一个bare
super 存储库。 bare
存储库没有任何签出分支。
以下命令将创建一个新的裸git存储库并将当前数据推送到它。从那时起,您应该能够git push
,git 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
[编辑] 让解释更清晰。