即,我可以吗
cd d1
git clone .../foo
mv foo ../d2
并正常使用d2 / foo?
是否有任何后续的git操作会将git目录固定到绝对路径?
答案 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 fetch
或git ls-remote
。
如果远程移动,我们必须编辑配置文件中的URL,或使用git remote set-url ...
命令进行修复。
参考是绝对的这一事实与它无关。即使参考文献是相对这样的:
[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
url = ../../origrepo ## probably doesn't work!
充其量(如果有效)它将允许这两个git repos作为一个整体一起移动。如果原始仓库相对于新仓库移动,则相对路径没有帮助。
另一方面,引用是绝对的让我们移动新克隆的repo(在同一个文件系统中),这样它仍然引用它的远程。如果它是相对的,那就不会起作用。