保持下游分支更新 - 不断拉取不需要的文件

Keep Downstream Branch Updated - Keeps pulling unwanted files

我是 git 的新手,我正在兜圈子。我不确定这是一个正常的用例,但我假设有一个名为 dev 的分支,然后我有两个下游分支 htmlxml。每个都有“白名单”.gitignore。它们用于克隆到服务器目录中,我只想要分支中需要的文件。 (用于旁加载 Office App 的 WebServer 和网络共享)

我正在努力做到这一点,因此当我推送到开发时,“下游”分支 htmlxml pull/get 仅推送相应 .gitignore 个文件。

首先这里是我的设置,以免避免 X-Y 问题,因为我可能做错了..

我有 githooks 设置,当我推送到 dev 时,它 运行s 是一个进入 gitrepo 目录的脚本,然后 运行s 以下内容:

git checkout html
git pull #probably not needed as it should be updated, but no harm
git pull --no-edit origin dev
git add .
git commit -m "pulled from dev"
git push

与 xml 相同。

这里是HTML白名单/。git忽略:

/*
!/Commands/
!/Content/
!/Images/
!/Functions/
!/Scripts/
!*.css
!*.html
!*.js
!.gitignore

!/ExcelWebAddIn1
/ExcelWebAddIn1/*

!/ExcelWebAddIn1/ExcelWebAddIn1Web/
/ExcelWebAddIn1/ExcelWebAddIn1Web/*

!ExcelWebAddIn1/ExcelWebAddIn1Web/Commands/
!ExcelWebAddIn1/ExcelWebAddIn1Web/Content/
!ExcelWebAddIn1/ExcelWebAddIn1Web/Images/
!ExcelWebAddIn1/ExcelWebAddIn1Web/Functions/
!ExcelWebAddIn1/ExcelWebAddIn1Web/Scripts/
!ExcelWebAddIn1/ExcelWebAddIn1Web/*.js
!ExcelWebAddIn1/ExcelWebAddIn1Web/*.html
!ExcelWebAddIn1/ExcelWebAddIn1Web/*.css

这是我不断收到的消息和提取的“额外文件”,这些文件在我的测试中被修改,但根本不应该在这个分支中。我在没有它们的情况下初始化了分支并多次使用 git rm --cached ExcelWebAddIn1/.. 并多次删除并重新克隆了我的工作 git 目录。

...\git\vsdev>git pull --no-edit origin dev
remote: Enumerating objects: 17, done.
remote: Counting objects: 100% (17/17), done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 9 (delta 6), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (9/9), 724 bytes | 3.00 KiB/s, done.
From ssh://git.freesoftwareservers.com:10022/freesoftwareservers/vsdev
 * branch            dev        -> FETCH_HEAD
   47109fd..5fb82df  dev        -> origin/dev
CONFLICT (modify/delete): ExcelWebAddIn1/ExcelWebAddIn1/ExcelWebAddIn1Manifest/vsdev.localhost.xml deleted in HEAD and modified in 5fb82df36c84c4cc84536a60ecb243088a58d47b.  Version 5fb82df36c84c4cc84536a60ecb243088a58d47b of ExcelWebAddIn1/ExcelWebAddIn1/ExcelWebAddIn1Manifest/vsdev.localhost.xml left in tree.
CONFLICT (modify/delete): ExcelWebAddIn1/ExcelWebAddIn1/ExcelWebAddIn1Manifest/vsdev.prod.xml deleted in HEAD and modified in 5fb82df36c84c4cc84536a60ecb243088a58d47b.  Version 5fb82df36c84c4cc84536a60ecb243088a58d47b of ExcelWebAddIn1/ExcelWebAddIn1/ExcelWebAddIn1Manifest/vsdev.prod.xml left in tree.
Automatic merge failed; fix conflicts and then commit the result.

所以本质上,我做错了什么?这是 .gitignore 的错误配置吗,因为我一直在调整认为这是问题所在。或者也许可以定制 pull 命令?

还有,有没有办法在不处理本地副本的情况下 运行 pull/push 命令? IE:我希望我的 git 钩子脚本只是将 dev 推送到 html,然后 cd 到网络服务器和 运行 pull。无需另一个“克隆”目录即可供脚本使用。

好的,所以根据我的怀疑和@toreks 的评论,这不是正常的 GIT 用法。再加上我是 git 的新手,我花了一段时间才弄明白。如果我错了请纠正我,但我认为让我失望的是如果文件没有在该分支中提交就不会被跟踪的想法,但我相信当我从 master 中提取文件时,即使它不是在那个分支中提交它仍然被认为是“跟踪的”。

无论如何,这两行帮助我解决了很多问题:

查看忽略的文件:

nano -c .gitignore ;  find . -not -path './.git/*' | git check-ignore -v --stdin

查看跟踪的文件:

git ls-files **/*

最后我意识到在这种情况下我应该使用的方法是严格的checkout。我为 html/xml 存储库制作了 .gitignore 文件,正如我已经弄清楚的那样,但在这一点上,他们应该只检查正确的文件,即我的“白名单”。

以下是我如何重新启动并设置两个存储库:

git checkout dev
git push origin --delete localhostxml
git branch -d localhostxml
git checkout -b localhostxml
rm * -R

cat <<'EOF'>.gitignore
/*
!.gitignore
!update_branch.sh
!/ExcelWebAddIn1
/ExcelWebAddIn1/*
!/ExcelWebAddIn1/ExcelWebAddIn1
/ExcelWebAddIn1/ExcelWebAddIn1/*
!ExcelWebAddIn1/ExcelWebAddIn1/ExcelWebAddIn1Manifest
/ExcelWebAddIn1/ExcelWebAddIn1/ExcelWebAddIn1Manifest/*
!ExcelWebAddIn1/ExcelWebAddIn1/ExcelWebAddIn1Manifes/*localhost.xml
EOF

cat <<'EOF'>update_branch.sh
!#/bin/bash

git checkout origin/dev -- ExcelWebAddIn1/ExcelWebAddIn1/ExcelWebAddIn1Manifest/*.localhost.xml
git add . 
git commit -m "pulled from dev" 
git push --set-upstream origin localhostxml 
git push origin localhost
EOF
chmod +x update_branch.sh
./update_branch.sh

git checkout dev
git push origin --delete html
git branch -d html
git checkout -b html
rm * -R

cat <<'EOF'>.gitignore
/*
!.gitignore
!update_branch.sh
!/ExcelWebAddIn1
/ExcelWebAddIn1/*
!/ExcelWebAddIn1/ExcelWebAddIn1Web
/ExcelWebAddIn1/ExcelWebAddIn1Web/*
!/ExcelWebAddIn1/ExcelWebAddIn1Web/*.html
!/ExcelWebAddIn1/ExcelWebAddIn1Web/*.js
!/ExcelWebAddIn1/ExcelWebAddIn1Web/*.css
!/ExcelWebAddIn1/ExcelWebAddIn1Web/Content/
!/ExcelWebAddIn1/ExcelWebAddIn1Web/Images/
!/ExcelWebAddIn1/ExcelWebAddIn1Web/Functions/
!/ExcelWebAddIn1/ExcelWebAddIn1Web/Scripts/

EOF

cat <<'EOF'>update_branch.sh
!#/bin/bash

git checkout origin/dev -- ExcelWebAddIn1/ExcelWebAddIn1Web/*.html
git checkout origin/dev -- ExcelWebAddIn1/ExcelWebAddIn1Web/*.css
git checkout origin/dev -- ExcelWebAddIn1/ExcelWebAddIn1Web/*.js
git checkout origin/dev -- ExcelWebAddIn1/ExcelWebAddIn1Web/Content/
git checkout origin/dev -- ExcelWebAddIn1/ExcelWebAddIn1Web/Images/
git checkout origin/dev -- ExcelWebAddIn1/ExcelWebAddIn1Web/Functions/
git checkout origin/dev -- ExcelWebAddIn1/ExcelWebAddIn1Web/Scripts/

git add . 
git commit -m "pulled from dev" 
git push --set-upstream origin html
git push origin html
EOF
chmod +x update_branch.sh
./update_branch.sh

最后是我的钩子脚本:

#!/bin/bash

home=/opt/git/local/vsdev/
cd $home
git pull

git checkout html
./update_branch.sh

git checkout localhostxml
./update_branch.sh

git checkout prodxml
./update_branch.sh

html=/opt/odev/html/vsdev/
cd $html
git checkout html
git pull origin html

xml=/mnt/zfs/raid-z/odev/vsdev/
cd $xml
git pull

cd $home

touch /tmp/hookin