“git clone”会创建一个完全相对的目录吗?

时间:2015-12-18 16:31:41

标签: git version-control

即,我可以吗

cd d1
git clone .../foo
mv foo ../d2

并正常使用d2 / foo?

是否有任何后续的git操作会将git目录固定到绝对路径?

3 个答案:

答案 0 :(得分:3)

git存储库不知道它在哪里;你可以做到这一点而不用担心会产生奇怪的后果。

当然,如果你移动原始存储库,克隆将不知道从哪里拉(遥控器是绝对路径)。这是移动存储库的唯一警告(我知道)。

答案 1 :(得分:3)

是的,您可以git clone进入任何目录并将其移动到任何其他目录并使用它"通常"。所有git真正关心的是.git文件夹,并且项目的子目录与存储库的历史记录相匹配。

如果您试图阻止某人修改目录结构或移动位置,您可能需要使用系统的管理策略和工具。

答案 2 :(得分:1)

独家新闻基本上是这样的:

~/test$ mkdir origrepo
~/test$ cd origrepo/
~/test/origrepo$ git init
Initialized empty Git repository in /home/kaz/test/origrepo/.git/
~/test/origrepo$ cd ..
~/test$ mkdir d1
~/test$ cd d1
~/test/d1$ git clone ../origrepo
Cloning into 'origrepo'...
done.
warning: You appear to have cloned an empty repository.
~/test/d1$ cat origrepo/.git/config 
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = /home/kaz/test/d1/../origrepo
[branch "master"]
    remote = origin
    merge = refs/heads/master
    rebase = true

克隆的repo树中的对象都不会以任何方式绝对或相对于原始目录(除非有人做了些傻事,比如在版本控制中存储绝对符号链接,预计将在树本身内解决。)

git数据库中的实际对象具有与签出树中的路径名无关的抽象名称。 (A"裸" git存储库甚至没有签出的树)。索引中的名称是相对的。

但是,正如我们从.git/config文件的上述转储中可以看到的那样,对上游远程的引用是绝对的:/home/kaz/test/d1/../origrepo

如果我们移动回购/home/kaz/test/d1/../origrepo;然后,访问遥控器的任何git操作都将无效,例如git fetchgit ls-remote

如果远程移动,我们必须编辑配置文件中的URL,或使用git remote set-url ...命令进行修复。

参考是绝对的这一事实与它无关。即使参考文献是相对这样的:

[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = ../../origrepo   ## probably doesn't work!

充其量(如果有效)它将允许这两个git repos作为一个整体一起移动。如果原始仓库相对于新仓库移动,则相对路径没有帮助。

另一方面,引用是绝对的让我们移动新克隆的repo(在同一个文件系统中),这样它仍然引用它的远程。如果它是相对的,那就不会起作用。

相关问题