如何使用Git跟踪单个文件的版本?

时间:2012-06-20 21:23:52

标签: git

假设我有一个文件,foo.txt,我想用Git管理,而我想把它移到自己的目录中(让我们说)/用户/我/文件,还有大量其他文件我不想包含在foo.txt的回购中。这可能吗?

我尝试创建一个裸仓库(所以它不会被命名为.git):

git init --bare .foo.txt

并计划通过在info / exclude文件中输入类似内容来排除除foo.txt之外的所有内容:

*
!foo.txt

但我遇到的问题是我甚至无法执行git status,因为似乎没有办法传递.git目录的非标准替换。

使用普通的.git目录是行不通的,因为它会限制我对这个文件进行版本控制,或者强迫我在同一个repo中包含任何其他文件,我希望能够在其中对其他文件进行版本控制目录在他们自己的仓库中。

我意识到这不是Git的用例,但由于它是我已经熟悉的强大工具,我更愿意使用它而不是别的东西,如果有办法那样做的话。

4 个答案:

答案 0 :(得分:6)

如果你像这样运行git,你可以完全按照你想要的那样做:

git --git-dir=.foo.txt --work-tree=. status

将第一部分别名变为git-foo,然后您即可参加比赛。

答案 1 :(得分:3)

如何使用.gitignore文件创建应编辑的文件的过滤器。此解决方案避免了窗口上不支持的硬链接。

例如以下文件:

$ cat .gitignore
*
!data.xml

将git配置为忽略除“data.xml”之外的所有文件。

答案 2 :(得分:2)

我认为您最好的选择是在一个单独的目录中创建一个repo,并在其中为您想要包含的每个文件创建一个硬链接:

mkdir some_repo
cd some_repo
git init
ln path/to/file file
# add & commit

答案 3 :(得分:1)

跟踪存储在单独目录中的存储库中的单个文件最方便。

创建一个存储git存储库的目录

mkdir my-repo-path

转到worktree目录(所需文件所在的位置)

cd my-worktree-path

.git

的隐藏子目录my-repo-path内初始化一个单独的存储库
git init --separate-git-dir my-repo-path\.git

与单独的存储库一起,git在worktree目录中创建了一个隐藏文件.git。如果您愿意,可以将其删除(如果要在某个单独的存储库中单独跟踪工作树目录中的其他文件,则可能很有用。)

del /AH .git

在任何文字编辑器中打开文件my-repo-path\.git\info\exclude,并在末尾添加以下行(其中foo.txt是您要跟踪的文件):

*
!foo.txt

在命令提示符下,转到git repo并添加将要提交的内容。

cd my-repo-path\.git
git add .
git commit

添加远程源并推送主分支,向其添加上游(跟踪)引用。

git remote add origin <url>
git push -u origin master

之后,您将从git repo目录添加以下提交(请参阅倒数第二步)。