忽略所有复刻中 Github 中文件的更改,而不从存储库中删除文件
Ignore Changes to a file in Github among all forks, without deleting the file from repository
我的 github 存储库中有一个 config/auth.js 文件(它有很多分支)我想忽略对该文件的任何进一步更改。搜索后,我发现了以下三种方式,但其中 none 对我有用:
1. git rm --chaced
这将删除文件。
2. git update-index --assume-unchanged config/auth.js
这在我的机器上工作,但每个贡献者也必须 运行 在他的 fork 上执行此命令(我不希望他们这样做)。
3. git 更新索引 --skip-worktree config/auth.js
与案例2相同的问题
基本上我不想让其他人知道发生了什么,当同步他们的 fork(rebase) 时,文件中的更改被自动忽略。
git rm --cached
这将从索引 中取消暂存文件。它对存储库没有持久影响。
git update-index --assume-unchanged config/auth.js
git update-index --skip-worktree config/auth.js
如您所述,这些在您的本地索引上有效,但不共享(就像第一个选项一样)。
我认为您需要做的就是在存储库中添加 .gitignore
的路径,然后提交 .gitignore
.
由于 .gitignore
只是告诉 Git 在执行 add/commit 时忽略路径,因此在 add/commit 期间人们可能对其本地副本所做的任何更改都将被忽略,并且您的副本也是如此。因此不应对该文件进行任何更改。
同时,.gitignore
也不是擦除文件现有历史记录的魔杖。所以它的当前状态应该留在那里,它会保留在你的历史和 git-log 中。您将无法再更改它(除非将其从 .gitignore
中删除)。
任何满足您要求的解决方案都将有 吨 的 "behind the scene's magic",这随时可能会出错;不推荐。
问题是,如果你想忽略他们对给定文件的更改,但你不想让他们看到你所做的任何影响,那么你一定需要查看不同的集合的承诺比他们。例如,如果您有
x --- x --- x <--(master)
他们克隆了,所以他们有
x --- x --- x <--(origin/master)(master)
然后他们进行了一些更改,包括对配置进行编辑,因此他们
x --- x --- x <--(origin/master)
\
O <--(master)
对于 "ignore" 的回购,对配置文件的更改意味着您最终会得到
x --- x --- x --- O' <--(master)
合并他们的更改后。 O'
必然 来自 O
的不同提交。客户希望在 origin/master
处看到 O
,如果您向他们提供 origin/master
现在处于 O'
的 "reality",确实会造成很大的破坏。
所以为了让事情顺利进行,你必须存储 O
并向分叉表示 master
的上游指向 O
。鉴于您有多个 fork,每个 fork 都可能对您的配置文件有自己的更改,您必须:
1) 为每个分支创建一个 "bridge" 存储库,从而更改他们用来称呼你的远程 URL,
或
2) 在您的原始仓库中为每个分叉维护一组单独的分支,要求分叉配置适当的 refspec。
因此,真正进行此更改 "invisible" 是不可能的。假设您想要这两个选项中的 "lighter weight" - 我相信会是 (2) - 您最终会得到类似
的结果
x --- x --- x --- O <--(master)
\
O' <--(fork-a/master)
现在您必须使用挂钩来自动对 master
和 fork-a/master
之间的更改进行变基(同时从变基中过滤对配置文件的更改)。我只看到那里有灾难的机会。
另一个选项(bridge repos)看起来和上面的很像。它只是防止在任何单个回购中看起来 甚至更糟 ,因为您实际上有很多分叉。我猜它构建了叉子之间变化的流动方式,但是你必须在所有这些回购协议之间进行协调。
我看不到其中任何一个真正有效。
我的 github 存储库中有一个 config/auth.js 文件(它有很多分支)我想忽略对该文件的任何进一步更改。搜索后,我发现了以下三种方式,但其中 none 对我有用:
1. git rm --chaced
这将删除文件。
2. git update-index --assume-unchanged config/auth.js
这在我的机器上工作,但每个贡献者也必须 运行 在他的 fork 上执行此命令(我不希望他们这样做)。
3. git 更新索引 --skip-worktree config/auth.js
与案例2相同的问题
基本上我不想让其他人知道发生了什么,当同步他们的 fork(rebase) 时,文件中的更改被自动忽略。
git rm --cached
这将从索引 中取消暂存文件。它对存储库没有持久影响。
git update-index --assume-unchanged config/auth.js
git update-index --skip-worktree config/auth.js
如您所述,这些在您的本地索引上有效,但不共享(就像第一个选项一样)。
我认为您需要做的就是在存储库中添加 .gitignore
的路径,然后提交 .gitignore
.
由于 .gitignore
只是告诉 Git 在执行 add/commit 时忽略路径,因此在 add/commit 期间人们可能对其本地副本所做的任何更改都将被忽略,并且您的副本也是如此。因此不应对该文件进行任何更改。
同时,.gitignore
也不是擦除文件现有历史记录的魔杖。所以它的当前状态应该留在那里,它会保留在你的历史和 git-log 中。您将无法再更改它(除非将其从 .gitignore
中删除)。
任何满足您要求的解决方案都将有 吨 的 "behind the scene's magic",这随时可能会出错;不推荐。
问题是,如果你想忽略他们对给定文件的更改,但你不想让他们看到你所做的任何影响,那么你一定需要查看不同的集合的承诺比他们。例如,如果您有
x --- x --- x <--(master)
他们克隆了,所以他们有
x --- x --- x <--(origin/master)(master)
然后他们进行了一些更改,包括对配置进行编辑,因此他们
x --- x --- x <--(origin/master)
\
O <--(master)
对于 "ignore" 的回购,对配置文件的更改意味着您最终会得到
x --- x --- x --- O' <--(master)
合并他们的更改后。 O'
必然 来自 O
的不同提交。客户希望在 origin/master
处看到 O
,如果您向他们提供 origin/master
现在处于 O'
的 "reality",确实会造成很大的破坏。
所以为了让事情顺利进行,你必须存储 O
并向分叉表示 master
的上游指向 O
。鉴于您有多个 fork,每个 fork 都可能对您的配置文件有自己的更改,您必须:
1) 为每个分支创建一个 "bridge" 存储库,从而更改他们用来称呼你的远程 URL,
或
2) 在您的原始仓库中为每个分叉维护一组单独的分支,要求分叉配置适当的 refspec。
因此,真正进行此更改 "invisible" 是不可能的。假设您想要这两个选项中的 "lighter weight" - 我相信会是 (2) - 您最终会得到类似
的结果x --- x --- x --- O <--(master)
\
O' <--(fork-a/master)
现在您必须使用挂钩来自动对 master
和 fork-a/master
之间的更改进行变基(同时从变基中过滤对配置文件的更改)。我只看到那里有灾难的机会。
另一个选项(bridge repos)看起来和上面的很像。它只是防止在任何单个回购中看起来 甚至更糟 ,因为您实际上有很多分叉。我猜它构建了叉子之间变化的流动方式,但是你必须在所有这些回购协议之间进行协调。
我看不到其中任何一个真正有效。