有些情况下我无法使用.gitignore文件,否则,git push从远程清除关键文件.在这些情况下,我应用于git update-index --assume-unchanged <file>我想忽略的文件.
应用假设未更改的规则并调用后git push,这些规则是否会附加到远程分支,以便所有后续的pull(来自其他客户端)将继承它们?或者,这些客户端是否也必须git update-index --assume-unchanged <file>在其计算机上单独运行命令?
如果没有继承命令 - 有没有人为此之前编写过服务器挂钩?而不是强制要求所有当前和未来的客户免受它的侵害?
Bar*_*end 41
索引对于您的工作站是本地的,您在那里所做的任何更改都不会传播到同一个远程的其他克隆.
(更新后,问题更新后)
有些情况下我无法使用.gitignore文件,否则,在git push上,关键文件将从远程清除.
这不是真的.git ignore文件不会影响已在存储库中跟踪的文件.如果在提交文件.gitignore后添加文件,它将保留在存储库中; 它不会被清除.实际上,它的表现几乎就像它根本没有被忽略一样.
您可以在临时存储库中轻松检查:
$ mkdir -p /tmp/repo
$ cd /tmp/repo
$ git init
Initialized empty Git repository in /tmp/repo/.git/
$ echo red > a.txt
$ git commit -am '1'
1 file changed, 1 insertion(+)
create mode 100644 a.txt
$ echo a.txt > .gitignore
$ echo b.txt >> .gitignore
$ git commit -am '2'
1 file changed, 2 insertions(+)
create mode 100644 .gitignore
Run Code Online (Sandbox Code Playgroud)
存储库现在包含两个文件:a.txt和.gitignore.两者都表现正常,您可以在克隆它时看到:
$ cd ..
$ git clone file://repo repo2
$ ls -A repo2
.git .gitignore a.txt
$ cd repo
Run Code Online (Sandbox Code Playgroud)
如果我们修改了被忽略的文件和请求git status,我们会看到它a.txt被视为已修改,尽管已被gitignored.我们可以正常添加和提交它; 事实上,如果你将跟踪文件添加到gitignore,它的行为就像它根本不在gitignore中一样.
$ echo green > a.txt
$ echo blue > b.txt
$ git status --short
M a.txt
$ git add a.txt
Run Code Online (Sandbox Code Playgroud)
该b.txt文件是不同的,因为它在git开始跟踪之前被忽略了.此文件通常不会进入存储库,但如果需要,我们可以强制它.
$ git add b.txt
The following paths are ignored by one of your .gitignore files:
b.txt
Use -f if you really want to add them.
fatal: no files added
$ git add -f b.txt
Run Code Online (Sandbox Code Playgroud)
git commit现在发出提交两个被git忽略的文件:
$ git commit -m '3'
2 files changed, 1 insertion(+), 1 deletion(-)
create mode 100644 b.txt
Run Code Online (Sandbox Code Playgroud)
长话短说,想想git忽略规则作为指导方针:-)
应用假设未更改的规则并调用git push后,这些规则是否会附加到远程分支,以便所有后续的pull(来自其他客户端)将继承它们?或者,这些客户端是否还必须在其计算机上单独运行git update-index --assume-unchanged命令?
后者.最接近的是将shell脚本添加到存储库中,以便为您进行更改.
如果没有继承命令 - 有没有人为此之前编写过服务器挂钩?而不是强制要求所有当前和未来的客户免受它的侵害?
如果您的目标是编写一个服务器挂钩来删除关键文件,就好像它们根本不是推送的一部分那样,那是不可能的.Git推送主要涉及提交 对象(和引用).它们的依赖对象(如树和blob)根据需要进行传输,具体取决于提交的可达性.它归结为,如果它没有提交,你不能把它推到一个遥控器(这是一个过于简单化,但它适用于存储库中的文件).另外,git提交是加密保护的.您无法在不更改提交哈希的情况下更改提交,如果更改提交哈希,则基本上会有一个不同的新提交(可能恰好具有与旧提交相同的差异).
这意味着服务器无法重写提交; 至少并非没有严重混淆执行推送的客户端(它仍将具有旧提交对象的副本).
您可以做的是编写一个post-receive挂钩,如果它们包含您不想更新的文件,则拒绝提交.这并没有真正解决您的问题,因为如果您无法git commit --assume-unchanged向同事解释,那么您可能更难以解释如何使用交互式rebase重新创建提交而不会在其中包含不需要的文件.
长话短说,我认为追逐每个人继续使用假设不变(可能与后接收挂钩结合)是你最不好的选择,如果你正在处理应该提交一次的文件,而不是像你现在那样.
你的生活会成为整个容易得多,如果你可以在自己的全部保留这些文件出的git的.我能想到的一件事:
.gitignore 这些文件位于其最终位置,它们必须存在,但始终会进行不必要的更改