GIT删除符号链接文件夹中的文件,在第二次运行git add -A时将其添加回来

时间:2016-04-04 20:38:25

标签: git symlink git-add

我有一个目录结构:

-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 -Agit 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

1 个答案:

答案 0 :(得分:0)

将我的git版本更新到最新版本后,似乎根本没有跟踪符号链接文件夹到文件。

我在这里张贴此内容供其他人查看。

我正在使用git version 2.8.1.windows.1

我能想到的唯一解决方案是将符号链接转换为联结,而不是在命令行上使用MKLINK /J

这将文件夹转换为ntfs联结,git很高兴跟随并将内部文件视为常规文件。

我个人使用方便的Link Shell Extension来轻松完成这项工作。

---更多信息---

这对我的用例来说没问题,因为我只有在repo之外的文件,我想要包含在几个repos中并让它们相互更新,而不管项目中其他开发人员在做什么。

如果你想要从你的仓库中分别正确地控制这些文件,那么不是解决方案 - 我相信,子模块就是答案。

如果你想使用符号链接到另一个目录,那么git跟踪符号链接本身,文件,因此项目中的其他开发人员必须自己添加这些符号链接。