我有一个目录结构:
-main
-sym-linked-dir
some-file.txt
some-other-file.bar
-sym-linked-dir-2
-some-dir
some-doubly-nested-file.foo
-normal-folder
spam.eggs
pan.cakes
hash.browns
我不根本没有符号链接的文件,只是符号链接的文件夹。
让我说我对spam.eggs进行了更改,然后我转到命令行并执行git add -A
- git将正常运行,但是说符号链接文件夹中的所有文件都将被标记为已删除:
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: main/sym-linked-dir/some-file.txt
deleted: main/sym-linked-dir/some-other-file.bar
deleted: main/sym-linked-dir-2/some-dir/some-doubly-nested-file.foo
modified: main/normal-folder/spam.eggs
Untracked files:
(use "git add <file>..." to include in what will be committed)
main/sym-linked-dir/
main/sym-linked-dir-2
当我再次运行git add -A
或git add main/sym-linked-dir
时,它会按预期正常添加文件夹和所有文件。
但是,如果我然后运行另一个 git add -A
,它将会再次删除文件。
,例如,如果我git add main/sym-linked-dir
,它会添加,我只会有1个未跟踪的更改,1个已删除的文件+文件夹。如果我然后执行git add -A
,它将取消跟踪 main/sym-linked-dir
,但再次认识到它一直在跟踪sym-linked-dir-2
。我做了另一个git add -A
,情况再次逆转了!
我的repo配置(在.git文件夹中)如下:
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
symlinks = true
ignorecase = true
hideDotFiles = dotGitOnly
我的全局配置中没有任何其他内容。
我的整体问题是:如何将git可靠地将符号链接文件夹中的文件作为常规文件处理,出于所有意图和目的,以便如上所述的混乱行为不会发生?< /强>
修改
我的用例是我有一个模块由两个(或更多)repos 本地使用,所以为了让它们与最新的代码保持更新,我只是在一些符号链接两种情况 - 这意味着无论何时我在一个仓库中更新它,它都会在其他任何仓库中更新,例如
-myAwesomeModules
-myModule
some-file.txt
-app1
-modules
-myModule <points to /myAwesomeModules/myModule>
some-file.txt
-app2
-modules
-myModule <also points to /myAwesomeModules/myModule>
some-file.txt
答案 0 :(得分:0)
将我的git版本更新到最新版本后,似乎根本没有跟踪符号链接文件夹到文件。
我在这里张贴此内容供其他人查看。
我正在使用git version 2.8.1.windows.1
我能想到的唯一解决方案是将符号链接转换为联结,而不是在命令行上使用MKLINK /J
。
这将文件夹转换为ntfs联结,git很高兴跟随并将内部文件视为常规文件。
我个人使用方便的Link Shell Extension来轻松完成这项工作。
---更多信息---
这对我的用例来说没问题,因为我只有在repo之外的文件,我想要包含在几个repos中并让它们相互更新,而不管项目中其他开发人员在做什么。
如果你想要从你的仓库中分别正确地控制这些文件,那么不是解决方案 - 我相信,子模块就是答案。
如果你想使用符号链接到另一个目录,那么git跟踪符号链接本身,不文件,因此项目中的其他开发人员必须自己添加这些符号链接。