尝试实现基于终端的工作流程,在Github和Git中变得更流畅,我想通过终端将所有本地AppleScript应用程序和脚本上传到存储库。在初始测试上传时,任何具有.scpt
扩展名的内容都被视为二进制文件,不会呈现为原始内容,但只允许下载查看原始文件。
因此研究将二进制转换为文本的方法,以便我可以利用版本控制,我找到了“Should the .gitattributes file be in the commit?”并且:
我使用以下方法在终端本地克隆我的回购:
git clone https://github.com/user/foobar.git
在cd
进入该目录后,我执行:touch .gitattributes
已验证的文件包含:ls -a
用open .gitattributes
将以下内容添加到.gitattributes
:
## Explicitly declare text files you want to always be normalized and converted to native line endings on checkout.
*.scpt text
## Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary
回到终端我做git commit -am "adding gitattributes"
运行git push
在浏览器中,我验证文件.gitattributes
是否存在且确实存在,我可以将其视为文本。
我将foobar.scpt
添加到我的本地目录。在终端中,我运行ls -a
以验证foobar
是否存在且确实存在。运行git add foobar.scpt
,然后使用git commit -am "adding test script"
和git push
。
当我在浏览器中打开文件foobar.scpt
时,它仍然表示我只能下载以查看原始文件。进一步研究我发现:
我已尝试过上述内容:
.gitattributes
添加到我的本地.git/info/.gitattributes
.gitattributes
添加到我的本地.git/info/gitattributes
,以复制exclude
文件的外观。我已将gitattributes
文件参数更改为:
*.scpt text
*.scpt diff
在尝试了以上所有内容后,我仍然无法将某些文件作为文本而不是二进制文件。在本地创建gitattributes
文件并将其推送到主文件的正确方法是什么,以便Mac文件将呈现为文本而不是二进制文件?
修改
评论提示How would you put an AppleScript script under version control?所以我git rm
foobar.scpt ,
git commit -am“删除了测试”and
git push`。
在本地删除foobar
后,我将..gitattributes
更新为:
## Explicitly declare text files you want to always be normalized and converted to native line endings on checkout.
*.scpt diff=scpt
## Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary
添加到我的配置文件(本地.git/config
下):
[diff "scpt"]
textconv = osadecompile
binary=true
我创建了一个名为test.scpt
的新脚本文件,并通过浏览器和终端上传到仍然生成。我做错了什么?
答案 0 :(得分:0)
从您的描述中,我不能完全确定.scpt
文件实际上是“部分”或“完全”二进制文件。
如果它们是“完全”二进制格式,例如dat
,exe
或bin
格式,请使用Git LFS对其进行同样处理。
git lfs install # Installs the Git LFS hooks into you ./.git/ folder
git lfs track "*.scpt" # Registers the *.scpt file extention as a binary format
注意: 需要双引号才能应用于所有*.scpt
文件,而不仅仅是项目根目录中的文件 >
这将使用常规的Git工作流程跟踪对文件的更改,因此您可以回滚到某些先前状态。据我了解,Git LFS会按原样存储整个文件,并且不会像git那样跟踪更改,因此请考虑每个文件的多个副本/克隆。大文件很快会导致大型存储库,并且必须定期清除较旧的文件,从而丢失了一些历史记录。
如果它们是“部分”二进制,例如pdf
或docx
,则可以使用.gitattributes
为它们配置“读取器”。 Martin Fenner's article很好地涵盖了这一点(我不会链接随处可见的抄袭副本)。本质上他使用
.gitattributes
为*.scrpt
文件标识不同的差异工具和编辑器,而.gitconfig
指定这些工具。
PATH/TO/Repository/.gitattributes
*.docx diff=scptdiff
SOME/PATH/.gitconfig
(我不记得.gitconfig
的住处)
[diff "scptdiff"]
textconv=SCPT2TEXT ...
prompt = false
[alias]
scptdiff =SCPTDIFF ...
注意: SCPT2TEXT
代表*.scpt
阅读器/转换器和SCPTDIFF
代表*.scpt
的差异工具和...
的参数(不包括文件名)
在此文件上有git版本控制。它将为您跟踪更改,但可能会导致合并过程中出现问题;我已经有一段时间没有使用它了,但我记得它运行得很好。
使用.gitattributes
还会将文件标记为二进制,在这种情况下git只会在文件周围复制文件,而不会跟踪任何更改。两个人编辑文件将最终覆盖另一个人的工作。这对于不经常更改的数据文件来说意味着更多。
我个人认为您的问题与行尾有关。您似乎正在从CRLF
更改为LF
,反之亦然。当您推送到中央存储库时,这可能会破坏scpt格式。在推送过程中,将转换行尾并转换为“ mangled”文件,然后从服务器下载“ mangled”文件,结果发现该文件确实已损坏。这可能就是为什么它们在Web界面中不可见的原因。如果您还原了损坏的文件中的行尾,您将再次获得原始的“固定”文件。
我的规则是在Windows <-> Linux
之间切换行尾,并留给Linux <-> Linux
;将服务器视为Linux
框;将Mac OS
视为Linux
。在系统/本地/用户.gitconfig
中进行设置。仅在确实需要的情况下,才在text/crlf
中启用text/crlf
或禁用.gitattributes
行端切换,例如, git下的二进制文件,只有一个人可以编辑,否则将被破坏。
同事在拉动时也可能会通过转换来破坏文件,而在推动时却不会,反之亦然。再次在.gitattributes
中启用/禁用此功能。
注意: 这并不能完全回答问题;请根据需要询问更多信息。另外,我无法在Mac OS上工作,所以我可能会在一些事情上出门