给出一个带有文件foo.c
和任意文件的git存储库,我可以检查给定文件在存储库中是否存在与foo.c
相同的内容吗?
也就是说,给定文件foo.c
的某个副本,我想检查存储库中是否存在这样的(按字节顺序相同)foo.c
。
答案 0 :(得分:1)
使用public class OpenGLRenderer implements GLSurfaceView.Renderer {
private Context _context;
private FloatBuffer vertexBuffer;
private ShortBuffer drawListBuffer;
private int positionHandle, program, colorHandle;
static final int COORDS_PER_VERTEX = 3;
static float squareCoords[] = {
-0.5f, 0.5f, 0.0f, // top left
-0.5f, -0.5f, 0.0f, // bottom left
0.5f, -0.5f, 0.0f, // bottom right
0.5f, 0.5f, 0.0f }; // top right
private short drawOrder[] = { 0, 1, 2, 0, 2, 3 }; // order to draw vertices
float color[] = {0.5f, 0.5f, 0.55f, 1.0f};
private int vertexCount;
private int vertexStride; // 4 bytes per vertex
public OpenGLRenderer(Context context, String colorStr){
super();
_context = context;
color = new float[]{(float)Integer.valueOf( colorStr.substring( 1, 3 ), 16 ) / 256.0f,
(float)Integer.valueOf( colorStr.substring( 3, 5 ), 16 ) / 256.0f,
(float)Integer.valueOf( colorStr.substring( 5, 7 ), 16 ) / 256.0f, 1.0f};
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
GLES20.glClearColor(1f,0f,0f,1f);
ByteBuffer bb = ByteBuffer.allocateDirect(squareCoords.length * 4);
bb.order(ByteOrder.nativeOrder());
vertexBuffer = bb.asFloatBuffer();
vertexBuffer.put(squareCoords);
vertexBuffer.position(0);
// initialize byte buffer for the draw list
ByteBuffer dlb = ByteBuffer.allocateDirect(drawOrder.length * 2);
dlb.order(ByteOrder.nativeOrder());
drawListBuffer = dlb.asShortBuffer();
drawListBuffer.put(drawOrder);
drawListBuffer.position(0);
vertexCount = squareCoords.length / COORDS_PER_VERTEX;
vertexStride = COORDS_PER_VERTEX * 4; // 4 bytes per vertex
GLES20.glEnable(GLES20.GL_SCISSOR_TEST);
compileShaders();
sendData();
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
GLES20.glViewport(0, 0, width, height);
GLES20.glScissor(0,0, width, height);
}
@Override
public void onDrawFrame(GL10 gl) {
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
GLES20.glEnableVertexAttribArray(positionHandle);
GLES20.glDrawElements(GLES20.GL_TRIANGLES, drawOrder.length, GLES20.GL_UNSIGNED_SHORT, drawListBuffer);
GLES20.glDisableVertexAttribArray(positionHandle);
}
private void sendData(){
positionHandle = GLES20.glGetAttribLocation(program, "position");
GLES20.glEnableVertexAttribArray(positionHandle);
GLES20.glVertexAttribPointer(positionHandle, COORDS_PER_VERTEX,
GLES20.GL_FLOAT, false,
vertexStride, vertexBuffer);
colorHandle = GLES20.glGetUniformLocation(program, "vColor");
GLES20.glUniform4fv(colorHandle, 1, color, 0);
}
private void compileShaders() {
int vertexShader = GLES20.glCreateShader(GLES20.GL_VERTEX_SHADER);
GLES20.glShaderSource(vertexShader, getShaderSource(R.raw.vertex_shader));
int fragmentShader = GLES20.glCreateShader(GLES20.GL_FRAGMENT_SHADER);
GLES20.glShaderSource(fragmentShader, getShaderSource(R.raw.fragment_shader));
GLES20.glCompileShader(vertexShader);
GLES20.glCompileShader(fragmentShader);
program = GLES20.glCreateProgram();
GLES20.glAttachShader(program, vertexShader);
GLES20.glAttachShader(program, fragmentShader);
GLES20.glLinkProgram(program);
GLES20.glUseProgram(program);
}
private String getShaderSource(int input){
StringBuilder total = new StringBuilder();
try{
InputStream stream =
_context.getResources().openRawResource(input);
BufferedReader r = new BufferedReader(new InputStreamReader(stream));
total = new StringBuilder();
for (String line; (line = r.readLine()) != null; ) {
total.append(line).append('\n');
}
} catch (IOException e){
System.out.println(e.getMessage());
}
return total.toString();
}
}
或git log --all -- foo.c
查找文件。然后,您可以将git repo中的哈希与git rev-list --all | xargs -I '{}' git ls-tree --full-tree -r '{}' | grep 'foo.c'
进行比较,并将文件系统中的哈希与git ls-files -s foo.c
进行比较,以确保它是相同的文件。
答案 1 :(得分:1)
当然。 git log --raw
会在每条更改的路径上显示新旧sha,也许最简单的输出是来自
git log --raw --no-abbrev --all -m --pretty=format:%H
在那寻找你的影子。
如果“文件foo.c
的某些副本”表示您不一定要将该foo.c
添加到存储库中,则可以使用例如git hash-object foo.c
,否则git rev-parse
可以搜寻任何现有ID。
类似
git log --raw --no-abbrev --all -m --pretty=format:%H \
| awk 'NF==1 {commit=$1} $4==thehash{print commit,$0}' thehash=`git hash-object foo.c`
答案 2 :(得分:1)
一种简单的方法是:
git cat-file -t $(git hash-object path/to/foo.c)` # Assuming bash syntax...
如果已将与blob
字节相同的任何文件提交到存储库,则将打印foo.c
(无论文件路径/名称如何),
以及fatal: git cat-file: could not get object info
(如果它不在仓库中)。
它计算输入文件path/to/foo.c
的sha-1哈希,然后查询由该哈希标识的git-object的类型,如果git中不存在该文件,则将产生错误消息对象数据库。
缺点是它只是回答存储库中是否存在文件的问题。
它不会告诉您匹配文件的路径,也不会告诉您包含该匹配文件的提交/提交。