【问题标题】:git: How do you add an external directory to the repository?git:如何将外部目录添加到存储库?
【发布时间】:2010-03-05 00:30:59
【问题描述】:

我想将外部目录添加到现有存储库。

外部目录: /home/一些/目录

工作目录: /htdocs/.git

如果我尝试从 /htdocs 目录执行以下命令:

git add /home/some/directory

我收到一个错误: 致命:“/home/some/directory”在存储库之外

【问题讨论】:

标签: git add


【解决方案1】:

如果我需要做类似的事情,我通常会将该外部文件或目录移动到我的 git 存储库中并将其原始位置符号链接到新位置。

mv /home/some/directory /htdocs/directory
ln -s /htdocs/directory /home/some/
git add ./directory

当我为想要保持在版本控制下但必须存储在特定位置的应用程序开发插件时,我会使用这种技术。

【讨论】:

  • 这对我在 Mac OS X 10.10.3 中根本不起作用。基本上,Wordpress 无法识别符号链接的插件目录或文件,并且它们不会出现在 WP 插件列表中。我错过了什么吗?
  • 与 smb 分享任何想法?我想使用 git 同步 Firefox 书签。
  • 太棒了。我曾尝试在另一个方向上做一个符号链接,而 git 却大吃一惊。 ;)
【解决方案2】:

我也遇到了同样的错误...谷歌搜索到死...没有太多结果。

Christian 的回答奏效了:

git --work-tree=/ add /home/some/directory

但后来“工作树”让我继续前进。我 grep 了所有 Git 文档并提出了 core.worktree

我用过

git config --global core.worktree /

瞧!我现在可以从系统中的 any 目录添加。 不知道会不会在其他地方出现问题,我会尽量更新。

【讨论】:

  • 您的意思是写“我现在可以从系统中的any 目录添加。”?只是好奇,我的文案编辑非常想编辑你的答案。 :P
  • 是的,我做到了,这就是轻度阅读障碍对您的影响……您的大脑已经完成了该段落并在您的手指仍在中间时做其他事情。 (抱歉回复晚了)
  • 所以我做不到git add *:P
  • 我不确定发生了什么,但是在尝试了这个之后 GitHub 无法再找到我的存储库,然后崩溃了。
  • 谨慎后最好不要对/进行实验,而是在/home/user目录中选择一个测试目录。并且还可以使用--local(顺便说一下默认值,而不是--global)来玩您的本地存储库
【解决方案3】:
git --work-tree=/ add /home/some/directory

【讨论】:

  • 这解释了一点:stackoverflow.com/questions/5283262/… 虽然我不清楚如果有人克隆了那个 repo 会得到什么
  • 这也使得 .gitignore 的编写变得非常复杂,并且 git status 和 git add --a 将删除 git 工作目录之外的文件。您可以将工作目录设置为本地存储库设置,但默认情况下会监控设置目录下的所有内容。这又需要 gitignore 的帮助。麻烦多过它的价值。
  • 请参阅此讨论区中的stackoverflow.com/a/8626989/5459638,了解有关此解决方案的其他 cmets
【解决方案4】:

有一个非常简单的解决方案。

假设您的 Git-repo 在 /var/data/my-app 中,并且您想将 /var/data/public/ 添加到该 repo。你不能使用'add',因为 Git 不会在 repo 的根目录之外添加资源。所以..

解决方案:

  1. 将 /var/data/public/ 目录移至 Git-repo 根目录 (/var/data/my-app)。

  2. 在 /var/data/public 中创建到 /var/data/my-app/public 文件夹的符号链接(符号链接),使用:ln -s source_file_or_directory virtual_file_or_directory

然后,只需使用git add 以正常方式将移动的文件或目录添加到 Git。您的 Git 源代码控制现在正在跟踪所需的文件/文件夹,并且您在外部目录中的符号链接确保文件/文件夹可供其他任何人访问!

【讨论】:

  • 这实际上并不跟踪目标目录中的任何内容。它只是跟踪链接。对吗?
  • @PeterSalazar 否,因为 Stormbytes 建议将目标目录移动到 git 存储库中。符号链接保持原始位置。如果您在 repo 中添加了链接,那么您是正确的。
  • 如果有多个用户使用同一台机器参与同一个 git 项目,这将无法正常工作。示例:假设在同一台机器上有两个用户:U 和 T。U 象征性地将 /var/linked 目录链接到其主文件夹内的某个位置。另一个用户 T 想要编辑 /var/linked 目录中的某个文件,但他必须拥有该文件的权限。即使 T 对 U 的链接目录具有写权限,T 也会从 U 的存储库中编辑工作副本。
【解决方案5】:

如果您要添加到您的仓库的代码不是太大,您也可以在每次推送之前将其自动复制到您的仓库。

在我的例子中,我需要一个 R 文件,我经常修改它,在几个 repos 中,我写了一个小 shell 脚本:

#!/usr/bin/env bash

cp -r /some/directory/file.R .
git add .
git commit -m "add"
git push

...我运行此脚本以推送所有更改,包括 /some/directory 中的更改。

【讨论】:

    【解决方案6】:

    这让我开始思考,因为我非常想要使用符号链接文件/目录的解决方案,但我被困在 Windows 计算机上。据我所知,Windows 中的符号链接并没有真正以同样的方式工作。因此,另一种解决方案可能是编写两个脚本/bash 函数来“导入”和“导出”有问题的文件,例如:

    import() {
        cp -fr /home/some/directory /htdocs/
    }
    
    export() {
        cp -fr /htdocs/directory /home/some/
    }
    

    然后您将在您的存储库中拥有该文件的副本,您可以git add

    【讨论】:

      【解决方案7】:

      我会对外部目录中的每个文件进行硬链接。 由于硬链接不会对原始文​​件产生额外的开销,因此它可能是完美的同步。 唯一的问题是一个目录不能链接(只能由超级用户),所以必须创建它来存储文件。

      例如,通常zeppelin只支持notebook文件的版本控制,但我在父目录中添加了conf文件的硬链接如下:

      .
      ├── 2A94M5J1Z
      │   └── note.json
      ├── 2G2U2ZR1T
      │   └── note.json
      ├── conf
      │   ├── shiro.ini
      │   ├── zeppelin-env.sh
      │   └── zeppelin-site.xml
      └── README.md
      

      【讨论】:

        【解决方案8】:

        或者如果你想跨不同的 git repos 工作,你可以使用子模块(ln 不能以这种方式工作)。试试“man git-submodule”。

        【讨论】:

        • 我只是看了一眼,但是在其父 repo 之外有一个子模块看起来比只有 2 个 repos 更丑,特别是对于从带有外部子模块的 repo 中提取的人。你(或任何人)真的用过这个吗?
        【解决方案9】:

        如果您使用 windows git bash 终端,请使用此代码移动目录 并建立一个符号链接到源

        git mv <source_directory> <destination_directory>
        git ln -s <source_directory>
        

        【讨论】:

          【解决方案10】:

          向存储库中的目录添加符号链接。然后,添加相同的内容。

          ln -s /home/some/directory/
          git add directory
          

          【讨论】:

          • 但这实际上并没有跟踪目标目录中的任何内容。它只是跟踪链接。
          • 那么,如何递归跟踪目标目录下的所有内容?
          • 它只是将链接跟踪为上述回复状态,如果其他人克隆 repo,他们会得到指向“无处”(或更糟糕的是,“某处”)的链接。
          猜你喜欢
          • 2010-09-12
          • 1970-01-01
          • 2012-04-19
          • 2013-09-29
          • 1970-01-01
          • 2014-01-07
          • 1970-01-01
          • 1970-01-01
          • 2019-03-10
          相关资源
          最近更新 更多