使用git管理主目录

使用git管理主目录,git,Git,我想在我的Linux$HOME目录中创建一个git-repo。在这个回购协议中——显然——我可以在版本控制下添加所有内容,但这没有任何意义。我只想添加与我相关的文件和文件夹,如.vimrc、.vim、.bashrc等(可能只是隐藏的文件和文件夹,但可能不是) 我知道我可以利用.gitignore来尝试实现这样的行为,但那将是痛苦的,而且实际上是不可维护的。相反,我想知道的是,是否有任何方法可以手动声明我想要管理的文件和文件夹,并且仅此而已。我想您正在寻找。.gitignore # Ignore

我想在我的Linux$HOME目录中创建一个git-repo。在这个回购协议中——显然——我可以在版本控制下添加所有内容,但这没有任何意义。我只想添加与我相关的文件和文件夹,如.vimrc、.vim、.bashrc等(可能只是隐藏的文件和文件夹,但可能不是)


我知道我可以利用.gitignore来尝试实现这样的行为,但那将是痛苦的,而且实际上是不可维护的。相反,我想知道的是,是否有任何方法可以手动声明我想要管理的文件和文件夹,并且仅此而已。

我想您正在寻找。

.gitignore

# Ignore everything
*

# But not these files...
!*.vimrc
!*.vim
!*.bashrc
!.gitignore

# etc...

我会设置一个别名,仅用于您的家庭回购 通过这种方式,您可以使用别名代替git命令,并且您总是知道您正在使用的上下文

# .bashrc
alias home='git --work-tree=$HOME --git-dir=$HOME/.home'
发出命令

$ home init
将在$home中的.home文件夹中创建一个与当前目录无关的repo。您可以使用别名为“home”而不是“git”的home repo

这和.gitignore应该是您所需要的全部

# .gitignore
*
# keep track
!.bashrc
!.gitignore
注意。不要将.ssh/keys保存在repo中,因为它会带来文件权限和安全问题。

我建议不要将$HOME目录置于git版本控制之下。我这样做是因为我觉得自己非常聪明,希望我的.dot文件处于版本控制之下。然而,git是贪婪的。我不得不在$HOME/.gitignore中添加大量目录(甚至*)。在您的主目录中的其他地方是否有git存储库?是的。但这些git存储库将使用$HOME/.gitignore作为全局.gitignore,除非您在其他地方设置它。因此,尝试在这些子目录存储库中添加文件是一件非常痛苦的事情


相反,将重要文件放在单独的目录中。比如说,~/dot文件。现在将其作为git存储库,并将所有重要的.dot文件符号链接到该新存储库。瞧。问题解决了,尽管在链接上花费了一些时间。

我认为最好的方法是在其他地方(最好是在物理上不同的磁盘上)建立一个git存储库,并在其中添加文件。
您可以使用doing创建空的git回购
(在安全的文件系统中,最好是不同的磁盘,如/home1)

现在,转到您的主目录,并执行以下操作

git clone /home1/mynewrepos.git   # now you are cloning from empty git repos.

然后将您宝贵的文件添加到git(git add、git commit、git push..等等)。我并没有尝试将我常用的文件保存在家中,但我使用这种方法来管理我的本地项目文件(在上传到官方git repos之前)。但是,同样,如果您家中有许多git管理的文件,它们可能会受到您家中的.gitignore文件的影响。

您的意思是这样的?使用.gitignore文件的可能重复似乎更适合我现在的使用情况,但感谢您指出这一点!新的
.git
dir。由git init创建的
git init
与任何现有的用户特定配置冲突。通常可以在home dir中找到。我知道op是这么问的,但我个人不喜欢这种方法。如果您的主目录中出现新内容,您将永远不会收到自动警告。理想情况下,你只需一次决定是否忽略它或保留它。我现在正在尝试一个干净的debian安装,但不可否认,其中已经有相当多的瑕疵。一个很好的示例.gitignore文件for/home将是一个很好的资源,因为任何新的东西都应该是您安装的新软件,在这种情况下,我至少希望看到它的出现,并决定是否要在我的vcs中配置它。优点是,如果我重新安装或迁移等,我可以将旧的repo添加为远程,然后获取我所有软件的所有配置并合并到我想要的内容中。不仅仅是.bashrc和其他一些东西。这很好,但如果您的主目录中有其他Git模块,就不行了。@user1115652的观点是反对这一点的有效论点。但是,我们可以使用
git clean-nxd.[^.]*
列出被
.gitignore
忽略的所有文件。这是一个有趣的替代方法,可以列出主目录中所有未跟踪的文件,因为
*
规则忽略了所有内容,允许我们找到可能要在Git repo中跟踪的任何额外配置文件。我们还可以使用
git-check-ignore
来检查文件是否被忽略,但这与
git-clean
干运行的行为有些不同;非常感谢。我唯一的改变是不使用
.gitignore
,而是使用
$GIT\u DIR/info/exclude
(因此,
$HOME/.HOME/info/exclude
)。我也更喜欢
$HOME/.HOME.git
之类的,但这是多余的,因为有了这个别名。奇怪的是,如果我在机器A上实现了这个解决方案,并在机器B上克隆了repo,git会覆盖B上主目录中的现有文件吗?
git clone /home1/mynewrepos.git   # now you are cloning from empty git repos.