谢谢阅读!
我开始设置我的使用 git 和 GitHub 进行点文件配置并遇到了一个问题:我使用 my$HOME
作为我的 git 工作树,并通过使用别名将.git
-directory 放在我的 -directory 中:$HOME/.dotfiles
alias dotfiles="git --git --git-dir=$HOME/.dotfiles/.git/ --work-tree=$HOME"
我创建了一个GitHub 上的新存储库并添加了执照和自述文件那里。当我像这样克隆我的存储库时:
git clone \<url to the repository\> $HOME/.dotfiles
这执照和自述文件位于.dotfiles
- 目录中,但命令:
dotfiles status
将它们列为已删除!
我不要想要执照和自述文件在我的$HOME
-目录中。它们应该保留在 - 目录中的位置$HOME/.dotfiles
。
对此我能做什么?
答案1
实际上可以在 github 和 gitlab 会尊重的 master 分支中拥有 LICENSE 和 README 文件(显示在 github 或 gitlab 中的项目主目录中),但不能在你的主目录中。最简单的解决方案是将 README 放在.github
项目主文件夹中,但它仅适用于github。
但我实际上是在 gitlab 和 github 的项目主页上显示 LICENSE 和 README 的:
1.启动一个裸git存储库或复制现有存储库
首先为 xadf 启动一个裸 git 存储库,并在没有自述文件和/或许可证的情况下进行初始提交,并创建您的别名。别名可以是任何你想要的(例如dotfiles
),但我使用gitdf
它是为了更容易输入。
# Initialize a bare git directory
git init --bare $HOME/.dotfiles
# Sets up an alias so you don't have to type long commands
alias gitdf='git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME'
# Adds a remote where you'd push your changes
gitdf remote add origin [email protected]:yourusername/dotfiles.git
# Do not display untracked files (it would be a ton of untracked files in an actual home tree
gitdf config status.showUntrackedFiles no
或者,如果您已经有一个 dotfiles 存储库,您可能希望将其复制到您的家中:
# Clone existing repo with separate git directory (here it is ~/.dotfiles), and the work tree in a separate, temporary directory .dotfiles-temp
git clone --separate-git-dir=$HOME/.dotfiles https://github.com/yourusername/dotfiles.git .dotfiles-temp
# Copy the content of the temporary work tree to ~/
rsync --recursive --verbose --exclude '.git' .dotfiles-temp/ $HOME/
# Remove the temporary work tree
rm --recursive .dotfiles-temp
# Sets up an alias so you don't have to type long commands
alias gitdf='git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME'
# Sets remote directory
gitdf remote set-url origin [email protected]:yourusername/dotfiles.git
请注意,您可能需要将别名添加到您的别名中,.bashrc
以便每次登录时该别名都会保留。
2.然后我们创建一个分支
这是您在真实的主树中查看的实际分支。说吧,一个home
分支。
# Make branch 'home'
gitdf checkout -b home
# You may need to also add the branch to gitlab or github
gitdf push --set-upstream origin home
3.在分支master中,添加README和LICENSE
然后在分支主控中,如果您愿意,您可以安全地添加自述文件和许可证。这仅用于在 gitlab 或 github 的项目主页中提供信息。该文件不会出现在分支主目录的提交历史记录中,并且永远不应该在您的本地分支中引入。
# Switch back to branch 'master'
gitdf checkout master
# Make readme and license
touch ~/LICENSE ~/README.md
# Add them to your bare git repo
gitdf add LICENSE README.md
# Commit
gitdf commit
# Push
gitdf push
4. 仅对实际工作分支进行更改
然后返回到分支home
,这应该是点文件的实际签出分支,其中自述文件或许可证文件永远不会出现在其提交历史记录中。
gitdf checkout home
帖子设置
home
之后,对配置文件的更改仅从分支或从分支派生的任何分支完成home
。您可能需要偶尔(或定期)将它们合并到 master 中:
# Go to branch master
gitdf checkout master
# merge branch home to branch master
gitdf merge home
# push to remote
gitdf push
由于branch home没有LICENSE
和README.md
,合并不会产生冲突。
但你不应该以相反的方式这样做(例如,从分支home
, gitdf merge master
),因为它也会将LICENSE
和添加README.md
到你的工作主目录中。
每个特定分支中的多个特定于机器的配置
作为额外的好处,您可能希望派生分支home
用于其他特定用途(例如,在work
应该基于home
但具有特定于工作的配置的分支中):
# Check if we're in branch home
gitdf status -sb
# Checkout to branch home if we are not
gitdf checkout home
# Note that the -b flag means make branch if it does not exist
gitdf checkout -b work
# Add new branch to remote
gitdf push --set-upstream origin work
# Configure or add work-specific changes then commit
gitdf add .config/work/related/configfile
gitdf commit
# Push to remote
gitdf push
稍后,当您在分支中进行更改时home
,您所要做的work
就是将其也包含在分支中:
# move to branch work
gitdf checkout work
# merge branch home to branch home
gitdf merge home
# Push to remote
gitdf push
如果您有其他分支(全部从 分支home
,这意味着您必须从分支开始home
并创建新分支),例如laptop
,您也可以在必要时将 home 合并到它们。home
如果需要,您还可以合并在那里所做的更改。
不过,实际上,我建议先创建共享配置home
,然后将它们合并到必要的分支和master
.
因此,您可以像这样可视化合并方向:
master < home <> work
<> laptop
仅将家庭合并到主机、工作或笔记本电脑,或从工作、笔记本电脑合并到家庭,但绝不将主机合并到家庭。
实际生活应用
作为一个无耻的插件,你可以看到我如何在我的中设置这个 git 别名方法点文件存储库。它是上述步骤的更完善且适度复杂的实现。要安装它,我所要做的就是下载安装程序和控制器脚本(xadf),使其可执行,并将其放置在我的路径中的某个位置。
# Make directory, if it isn't present already
mkdir -p ~/.local/bin
# Download the executable into your local bin directory
wget -O ~/.local/bin/xadf https://gitlab.com/heno72/xadf/-/raw/master/.local/bin/xadf
# Make it executable
chmod +x ~/.local/bin/xadf
# Export path to local bin if it isn't set up already
PATH=~/.local/bin:$PATH
# Install xadf minimally
xadf --minimal-install
该脚本可以处理步骤 1(复制),签出到工作分支(默认为trunk
,相当于home
上面示例中的分支),包括生成配置文件以供将来使用(别名和一些函数)~/.config/xadf
:
# initialize, configure, load, and manage
xadf --init-bare --seat ~/.dotfiles
xadf --custom-install --seat ~/.dotfiles
. ~/.bashrc
xadf config status.showUntrackedFiles no
或者,如果您已经在远程拥有自己的裸 git 存储库:
# Clone and configure from a custom url, load, and manage
xadf -i -s [email protected]:heno72/xadf-gb.git --seat ~/.dotfiles
. ~/.bashrc
xadf status -sb
如果您的主文件夹中已经有裸 git 目录,则可以使用 xadf 来管理它们:
xadf --custom-install --seat ~/.dotfiles
. ~/.bashrc
安装后(并且获取了 .bashrc),我可以像任何 git 命令一样使用该脚本:
# Adds a new config file to tracked file
xadf add .config/new/config/file
# Commit changes
xadf commit
# Push changes to remote
xadf push
# Change working branch
xadf checkout newbranch
或者一些预定的动作:
xadf -l # list all tracked files
xadf -l .config # list all tracked files in ~/.config