Usa el control de versiones de objetos

Ir a los conceptos

En esta página, se describe cómo configurar el control de versiones de objetos y se dan ejemplos sobre su uso.

Configura el control de versiones de objetos

En las próximas secciones, se muestra cómo activar y desactivar el control de versiones de objetos mediante la herramienta de gsutil, la API de JSON y la API de XML. En la actualidad, el control de versiones de objetos no se puede controlar mediante Google Cloud Console.

Habilita el control de versiones de objetos

Para habilitar el control de versiones de objetos en un depósito, sigue estos pasos:

gsutil

Usa el comando gsutil versioning set on:

gsutil versioning set on gs://BUCKET_NAME

En el ejemplo anterior, BUCKET_NAME es el nombre del depósito correspondiente. Por ejemplo, my-bucket.

Muestras de código

C++

Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud Storage para C++.

namespace gcs = google::cloud::storage;
using ::google::cloud::StatusOr;
[](gcs::Client client, std::string const& bucket_name) {
  StatusOr<gcs::BucketMetadata> original =
      client.GetBucketMetadata(bucket_name);
  if (!original) throw std::runtime_error(original.status().message());

  StatusOr<gcs::BucketMetadata> patched = client.PatchBucket(
      bucket_name,
      gcs::BucketMetadataPatchBuilder().SetVersioning(
          gcs::BucketVersioning{true}),
      gcs::IfMetagenerationMatch(original->metageneration()));
  if (!patched) throw std::runtime_error(patched.status().message());

  if (patched->versioning().has_value()) {
    std::cout << "Object versioning for bucket " << bucket_name << " is "
              << (patched->versioning()->enabled ? "enabled" : "disabled")
              << "\n";
  } else {
    std::cout << "Object versioning for bucket " << bucket_name
              << " is disabled.\n";
  }
}

Java

Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud Storage para Java.

import com.google.cloud.storage.Bucket;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;

public class EnableBucketVersioning {
  public static void enableBucketVersioning(String projectId, String bucketName) {
    // The ID of your GCP project
    // String projectId = "your-project-id";

    // The ID of your GCS bucket
    // String bucketName = "your-unique-bucket-name";

    Storage storage = StorageOptions.newBuilder().setProjectId(projectId).build().getService();
    Bucket bucket = storage.get(bucketName);
    bucket.toBuilder().setVersioningEnabled(true).build().update();

    System.out.println("Versioning is now enabled for bucket " + bucketName);
  }
}

Python

Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud Storage para Python.

from google.cloud import storage

def enable_versioning(bucket_name):
    """Enable versioning for this bucket."""
    # bucket_name = "my-bucket"

    storage_client = storage.Client()

    bucket = storage_client.get_bucket(bucket_name)
    bucket.versioning_enabled = True
    bucket.patch()

    print("Versioning was enabled for bucket {}".format(bucket.name))
    return bucket

API de REST

API de JSON

  1. Obtén un token de autorización de acceso de OAuth 2.0 Playground. Configura Playground para usar tus credenciales de OAuth.
  2. Crea un archivo .json que contenga la siguiente información:

    {
      "versioning": {
        "enabled": true
      }
    }
  3. Usa cURL para llamar a la API de JSON con una solicitud de depósito PATCH:

    curl -X PATCH --data-binary @JSON_FILE_NAME.json \
      -H "Authorization: Bearer OAUTH2_TOKEN" \
      -H "Content-Type: application/json" \
      "https://storage.googleapis.com/storage/v1/b/BUCKET_NAME?fields=versioning"

    En el ejemplo anterior, se ilustra lo siguiente:

    • JSON_FILE_NAME es el archivo que creaste en el paso 2.
    • OAUTH2_TOKEN es el token de acceso que creaste en el paso 1.
    • BUCKET_NAME es el nombre del depósito correspondiente. Por ejemplo, my-bucket.

API de XML

  1. Obtén un token de autorización de acceso de OAuth 2.0 Playground. Configura Playground para usar tus propias credenciales de OAuth.
  2. Crea un archivo .xml que contenga la siguiente información:

    <VersioningConfiguration>
      <Status>Enabled</Status>
    </VersioningConfiguration>
  3. Usa cURL para llamar a la API de XML con una solicitud de depósito PUT y el parámetro de string de consulta versioning

    curl -X PUT --data-binary @XML_FILE_NAME.xml \
      -H "Authorization: Bearer OAUTH2_TOKEN" \
      "https://storage.googleapis.com/BUCKET_NAME?versioning"

    En los que:

    • XML_FILE_NAME es el archivo que creaste en el paso 2.
    • OAUTH2_TOKEN es el token de acceso que creaste en el paso 1.
    • BUCKET_NAME es el nombre del depósito correspondiente. Por ejemplo, my-bucket.

Una vez que el control de versiones de objetos está habilitado, cada vez que se reemplaza o borra una versión de objeto activa, esa versión se convierte en una versión no actual.

Inhabilita el control de versiones de objetos

Sigue los pasos a continuación para inhabilitar el control de versiones de objetos en un depósito:

gsutil

Usa el comando gsutil versioning set off:

gsutil versioning set off gs://BUCKET_NAME

En el ejemplo anterior, BUCKET_NAME es el nombre del depósito correspondiente. Por ejemplo, my-bucket.

Muestras de código

C++

Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud Storage para C++.

namespace gcs = google::cloud::storage;
using ::google::cloud::StatusOr;
[](gcs::Client client, std::string const& bucket_name) {
  StatusOr<gcs::BucketMetadata> original =
      client.GetBucketMetadata(bucket_name);
  if (!original) throw std::runtime_error(original.status().message());

  StatusOr<gcs::BucketMetadata> patched = client.PatchBucket(
      bucket_name,
      gcs::BucketMetadataPatchBuilder().SetVersioning(
          gcs::BucketVersioning{false}),
      gcs::IfMetagenerationMatch(original->metageneration()));
  if (!patched) throw std::runtime_error(patched.status().message());

  if (patched->versioning().has_value()) {
    std::cout << "Object versioning for bucket " << bucket_name << " is "
              << (patched->versioning()->enabled ? "enabled" : "disabled")
              << "\n";
  } else {
    std::cout << "Object versioning for bucket " << bucket_name
              << " is disabled.\n";
  }
}

Java

Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud Storage para Java.

import com.google.cloud.storage.Bucket;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;

public class DisableBucketVersioning {
  public static void disableBucketVersioning(String projectId, String bucketName) {
    // The ID of your GCP project
    // String projectId = "your-project-id";

    // The ID of your GCS bucket
    // String bucketName = "your-unique-bucket-name";

    Storage storage = StorageOptions.newBuilder().setProjectId(projectId).build().getService();
    Bucket bucket = storage.get(bucketName);
    bucket.toBuilder().setVersioningEnabled(false).build().update();

    System.out.println("Versioning is now disabled for bucket " + bucketName);
  }
}

Python

Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud Storage para Python.

from google.cloud import storage

def disable_versioning(bucket_name):
    """Disable versioning for this bucket."""
    # bucket_name = "my-bucket"

    storage_client = storage.Client()

    bucket = storage_client.get_bucket(bucket_name)
    bucket.versioning_enabled = False
    bucket.patch()

    print("Versioning was disabled for bucket {}".format(bucket))
    return bucket

API de REST

API de JSON

  1. Obtén un token de autorización de acceso de OAuth 2.0 Playground. Configura Playground para usar tus credenciales de OAuth.
  2. Crea un archivo .json que contenga la siguiente información:

    {
      "versioning": {
        "enabled": false
      }
    }
  3. Usa cURL para llamar a la API de JSON con una solicitud de depósito PATCH:

    curl -X PATCH --data-binary @JSON_FILE_NAME.json \
      -H "Authorization: Bearer OAUTH2_TOKEN" \
      -H "Content-Type: application/json" \
      "https://storage.googleapis.com/storage/v1/b/BUCKET_NAME?fields=versioning"

    En el ejemplo anterior, se ilustra lo siguiente:

    • JSON_FILE_NAME es el archivo que creaste en el paso 2.
    • OAUTH2_TOKEN es el token de acceso que creaste en el paso 1.
    • BUCKET_NAME es el nombre del depósito correspondiente. Por ejemplo, my-bucket.

API de XML

  1. Obtén un token de autorización de acceso de OAuth 2.0 Playground. Configura Playground para usar tus propias credenciales de OAuth.
  2. Crea un archivo .xml que contenga la siguiente información:

    <VersioningConfiguration>
      <Status>Suspended</Status>
    </VersioningConfiguration>
  3. Usa cURL para llamar a la API de XML con una solicitud de depósito PUT y el parámetro de string de consulta versioning

    curl -X PUT --data-binary @XML_FILE_NAME.xml \
      -H "Authorization: Bearer OAUTH2_TOKEN" \
      "https://storage.googleapis.com/BUCKET_NAME?versioning"

    En los que:

    • XML_FILE_NAME es el archivo que creaste en el paso 2.
    • OAUTH2_TOKEN es el token de acceso que creaste en el paso 1.
    • BUCKET_NAME es el nombre del depósito correspondiente. Por ejemplo, my-bucket.

Comprueba si el control de versiones de objetos está habilitado

Sigue los pasos a continuación para comprobar si el control de versiones de objetos está habilitado en un depósito:

gsutil

Usa el comando gsutil versioning get:

gsutil versioning get gs://BUCKET_NAME

En el ejemplo anterior, BUCKET_NAME es el nombre del depósito correspondiente. Por ejemplo, my-bucket.

Si el control de versiones de objetos está habilitado, la respuesta es similar a la siguiente:

gs://my-bucket: Enabled

API de REST

API de JSON

  1. Obtén un token de autorización de acceso de OAuth 2.0 Playground. Configura Playground para usar tus propias credenciales de OAuth.
  2. Usa cURL para llamar a la API de JSON con una solicitud de depósito GET:

    curl -X GET \
      -H "Authorization: Bearer OAUTH2_TOKEN" \
      "https://storage.googleapis.com/storage/v1/b/BUCKET_NAME?fields=versioning"

    En la que:

    • OAUTH2_TOKEN es el token de acceso que creaste en el paso 1.
    • BUCKET_NAME es el nombre del depósito correspondiente. Por ejemplo, my-bucket.

API de XML

  1. Obtén un token de autorización de acceso de OAuth 2.0 Playground. Configura Playground para usar tus propias credenciales de OAuth.
  2. Usa cURL para llamar a la API de XML con una solicitud de depósito GET y el parámetro de string de consulta versioning:

    curl -X GET \
      -H "Authorization: Bearer OAUTH2_TOKEN" \
      "https://storage.googleapis.com/BUCKET_NAME?versioning"

    En los que:

    • OAUTH2_TOKEN es el token de acceso que creaste en el paso 1.
    • BUCKET_NAME es el nombre del depósito correspondiente. Por ejemplo, my-bucket.

Trabaja con el control de versiones de objetos

En las siguientes secciones, se muestra cómo trabajar con el control de versiones de objetos. Para obtener un ejemplo detallado de cómo trabajar con el control de versiones de objetos, consulta Ejemplo de control de versiones de objetos.

Enumera las versiones no actuales de objetos

Para enumerar las versiones publicadas y no actuales de un objeto y ver sus números de generation, haz lo siguiente:

gsutil

Usa el comando gsutil ls -a:

gsutil ls -a gs://BUCKET_NAME

En el ejemplo anterior, BUCKET_NAME es el nombre del depósito correspondiente. Por ejemplo, my-bucket.

La respuesta se ve como el siguiente ejemplo:

gs://BUCKET_NAME/OBJECT_NAME1#GENERATION_NUMBER1
gs://BUCKET_NAME/OBJECT_NAME2#GENERATION_NUMBER2
gs://BUCKET_NAME/OBJECT_NAME3#GENERATION_NUMBER3
...

Muestras de código

C++

Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud Storage para C++.

namespace gcs = google::cloud::storage;
[](gcs::Client client, std::string const& bucket_name) {
  for (auto&& object_metadata :
       client.ListObjects(bucket_name, gcs::Versions{true})) {
    if (!object_metadata) {
      throw std::runtime_error(object_metadata.status().message());
    }

    std::cout << "bucket_name=" << object_metadata->bucket()
              << ", object_name=" << object_metadata->name()
              << ", generation=" << object_metadata->generation() << "\n";
  }
}

Go

Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud Storage para Go.

import (
	"context"
	"fmt"
	"io"
	"time"

	"cloud.google.com/go/storage"
	"google.golang.org/api/iterator"
)

// listFilesAllVersion lists both live and noncurrent versions of objects within specified bucket.
func listFilesAllVersion(w io.Writer, bucket string) error {
	// bucket := "bucket-name"
	ctx := context.Background()
	client, err := storage.NewClient(ctx)
	if err != nil {
		return fmt.Errorf("storage.NewClient: %v", err)
	}
	defer client.Close()

	ctx, cancel := context.WithTimeout(ctx, time.Second*10)
	defer cancel()

	it := client.Bucket(bucket).Objects(ctx, &storage.Query{
		// Versions true to output all generations of objects
		Versions: true,
	})
	for {
		attrs, err := it.Next()
		if err == iterator.Done {
			break
		}
		if err != nil {
			return fmt.Errorf("Bucket(%q).Objects(): %v", bucket, err)
		}
		fmt.Fprintln(w, attrs.Name, attrs.Generation, attrs.Metageneration)
	}
	return nil
}

Java

Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud Storage para Java.

import com.google.api.gax.paging.Page;
import com.google.cloud.storage.Blob;
import com.google.cloud.storage.Bucket;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;

public class ListObjectsWithOldVersions {
  public static void listObjectsWithOldVersions(String projectId, String bucketName) {
    // The ID of your GCP project
    // String projectId = "your-project-id";

    // The ID of your GCS bucket
    // String bucketName = "your-unique-bucket-name";
    Storage storage = StorageOptions.newBuilder().setProjectId(projectId).build().getService();
    Bucket bucket = storage.get(bucketName);
    Page<Blob> blobs = bucket.list(Storage.BlobListOption.versions(true));

    for (Blob blob : blobs.iterateAll()) {
      System.out.println(blob.getName() + "," + blob.getGeneration());
    }
  }
}

Node.js

Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud Storage para Node.js.

/**
 * TODO(developer): Uncomment the following line before running the sample.
 */
// const bucketName = 'Name of a bucket, e.g. my-bucket';

// Imports the Google Cloud client library
const {Storage} = require('@google-cloud/storage');

// Creates a client
const storage = new Storage();

async function listFilesWithOldVersions() {
  const [files] = await storage.bucket(bucketName).getFiles({
    versions: true,
  });

  console.log('Files:');
  files.forEach(file => {
    console.log(file.name, file.generation);
  });
}

listFilesWithOldVersions().catch(console.error);

Python

Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud Storage para Python.

from google.cloud import storage

def list_file_archived_generations(bucket_name):
    """Lists all the blobs in the bucket with generation."""
    # bucket_name = "your-bucket-name"

    storage_client = storage.Client()

    blobs = storage_client.list_blobs(bucket_name)

    for blob in blobs:
        print("{},{}".format(blob.name, blob.generation))

API de REST

API de JSON

  1. Obtén un token de autorización de acceso de OAuth 2.0 Playground. Configura Playground para usar tus propias credenciales de OAuth.
  2. Usa cURL para llamar a la API de JSON con una solicitud de objeto LIST:

    curl -X GET \
      -H "Authorization: Bearer OAUTH2_TOKEN" \
      "https://storage.googleapis.com/storage/v1/b/BUCKET_NAME/o?versions=true"

    En la que:

    • OAUTH2_TOKEN es el token de acceso que creaste en el paso 1.
    • BUCKET_NAME es el nombre del depósito correspondiente. Por ejemplo, my-bucket.

Las versiones no actuales de objetos tienen una propiedad timeDeleted.

API de XML

  1. Obtén un token de autorización de acceso de OAuth 2.0 Playground. Configura Playground para usar tus propias credenciales de OAuth.
  2. Usa cURL para llamar a la API de XML con una solicitud de depósito GET y el parámetro de string de consulta versions:

    curl -X GET \
      -H "Authorization: Bearer OAUTH2_TOKEN" \
      "https://storage.googleapis.com/BUCKET_NAME?versions"

    En los que:

    • OAUTH2_TOKEN es el token de acceso que creaste en el paso 1.
    • BUCKET_NAME es el nombre del depósito correspondiente. Por ejemplo, my-bucket.

Hay algunas diferencias en los resultados de la solicitud GET cuando se usa el parámetro de consulta versions. En particular, Cloud Storage muestra la siguiente información cuando incluyes un parámetro de consulta versions en la solicitud:

  • Un elemento Version que contiene información sobre cada objeto.
  • Un elemento DeletedTime que contiene la hora en la que la versión del objeto pasó a ser no actual (se borró o se reemplazó).
  • Un elemento IsLatest que indica si el objeto específico es la versión más reciente.
  • Se muestra un elemento NextGenerationMarker si la lista de objetos es parcial, lo que ocurre cuando tienes muchas versiones de objetos en un depósito. Usa el valor de este elemento en el parámetro de consulta generationmarker de las solicitudes posteriores para reanudar desde el último punto. El parámetro de consulta generationmarker se usa de la misma manera que se usa el parámetro marker para navegar por una lista de un depósito sin control de versiones.

Accede a las versiones no actuales de objetos

Para usar la versión no actual de un objeto cuando realizas tareas como descargar el objeto, ver sus metadatos o actualizar sus metadatos, haz lo siguiente:

gsutil

  1. Agrega el número de generation de la versión no actual al nombre del objeto:

    OBJECT_NAME#GENERATION_NUMBER

    En el que:

    • OBJECT_NAME es el nombre de la versión no actual. Por ejemplo, pets/dog.png.
    • GENERATION_NUMBER es el número de generación de la versión no actual. Por ejemplo, 1560468815691234.
  2. Con la string del paso 1, procede como lo harías con la versión publicada del objeto.

API de REST

API de JSON

  1. Agrega el número de generation de la versión no actual al URI del objeto:

    https://storage.googleapis.com/storage/v1/b/BUCKET_NAME/o/OBJECT_NAME?generation=GENERATION_NUMBER

    En el que:

    • BUCKET_NAME es el nombre del depósito que contiene la versión no actual. Por ejemplo, my-bucket.
    • OBJECT_NAME es el nombre de la versión no actual. Por ejemplo, pets/dog.png.
    • GENERATION_NUMBER es el número de generación de la versión no actual. Por ejemplo, 1560468815691234.
  2. Con el URI del paso 1, procede como lo harías con la versión publicada del objeto.

API de XML

  1. Agrega el número de generation de la versión no actual al URI del objeto:

    https://storage.googleapis.com/BUCKET_NAME/OBJECT_NAME?generation=GENERATION_NUMBER

    En el que:

    • BUCKET_NAME es el nombre del depósito que contiene la versión no actual. Por ejemplo, my-bucket.
    • OBJECT_NAME es el nombre de la versión no actual. Por ejemplo, pets/dog.png.
    • GENERATION_NUMBER es el número de generación de la versión no actual. Por ejemplo, 1560468815691234.
  2. Con el URI del paso 1, procede como lo harías con la versión publicada del objeto.

Copia las versiones no actuales de objetos

Para copiar una versión no actual de un objeto, haz lo siguiente:

gsutil

Usa el comando gsutil cp:

gsutil cp gs://SOURCE_BUCKET_NAME/SOURCE_OBJECT_NAME#GENERATION_NUMBER gs://DESTINATION_BUCKET_NAME/DESTINATION_OBJECT_NAME

En el que:

  • SOURCE_BUCKET_NAME es el nombre del depósito que contiene la versión no actual que deseas copiar. Por ejemplo, my-bucket.
  • SOURCE_OBJECT_NAME es el nombre de la versión no actual que deseas copiar. Por ejemplo, pets/dog.png.
  • GENERATION_NUMBER es el número de generación de la versión no actual que deseas copiar. Por ejemplo, 1560468815691234.
  • DESTINATION_BUCKET_NAME es el nombre del depósito en el que deseas copiar la versión no actual. Por ejemplo, my-bucket.
  • DESTINATION_OBJECT_NAME es el nombre de la copia de la versión no actual. Por ejemplo, pets/shiba.png.

Si se ejecuta de forma correcta, la respuesta se ve como el siguiente ejemplo:

Operation completed over 1 objects/58.8 KiB.

Muestras de código

C++

Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud Storage para C++.

namespace gcs = google::cloud::storage;
using ::google::cloud::StatusOr;
[](gcs::Client client, std::string const& source_bucket_name,
   std::string const& source_object_name,
   std::string const& destination_bucket_name,
   std::string const& destination_object_name,
   std::int64_t source_object_generation) {
  StatusOr<gcs::ObjectMetadata> copy =
      client.CopyObject(source_bucket_name, source_object_name,
                        destination_bucket_name, destination_object_name,
                        gcs::SourceGeneration{source_object_generation});
  if (!copy) throw std::runtime_error(copy.status().message());

  std::cout << "Successfully copied " << source_object_name << " generation "
            << source_object_generation << " in bucket " << source_bucket_name
            << " to bucket " << copy->bucket() << " with name "
            << copy->name()
            << ".\nThe full metadata after the copy is: " << *copy << "\n";
}

Java

Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud Storage para Java.

import com.google.cloud.storage.BlobId;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;

public class CopyOldVersionOfObject {
  public static void copyOldVersionOfObject(
      String projectId,
      String bucketName,
      String objectToCopy,
      long generationToCopy,
      String newObjectName) {
    // The ID of your GCP project
    // String projectId = "your-project-id";

    // The ID of your GCS bucket
    // String bucketName = "your-unique-bucket-name";

    // The ID of the GCS object to copy an old version of
    // String objectToCopy = "your-object-name";

    // The generation of objectToCopy to copy
    // long generationToCopy = 1579287380533984;

    // What to name the new object with the old data from objectToCopy
    // String newObjectName = "your-new-object";

    Storage storage = StorageOptions.newBuilder().setProjectId(projectId).build().getService();
    Storage.CopyRequest copyRequest =
        Storage.CopyRequest.newBuilder()
            .setSource(BlobId.of(bucketName, objectToCopy, generationToCopy))
            .setTarget(BlobId.of(bucketName, newObjectName))
            .build();
    storage.copy(copyRequest);

    System.out.println(
        "Generation "
            + generationToCopy
            + " of object "
            + objectToCopy
            + " in bucket "
            + bucketName
            + " was copied to "
            + newObjectName);
  }
}

Node.js

Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud Storage para Node.js.

/**
 * TODO(developer): Uncomment the following lines before running the sample.
 */
// const srcBucketName = 'Name of the source bucket, e.g. my-bucket';
// const srcFilename = 'Name of the source file, e.g. file.txt';
// const destBucketName = 'Name of the destination bucket, e.g. my-other-bucket';
// const destFilename = 'Destination name of file, e.g. file.txt';
// const generation = 'The generation of file to copy, e.g. 1'

// Imports the Google Cloud client library
const {Storage} = require('@google-cloud/storage');

// Creates a client
const storage = new Storage();

async function copyOldVersionOfFile() {
  // Copies the file to the other bucket
  await storage
    .bucket(srcBucketName)
    .file(srcFilename, {
      generation,
    })
    .copy(storage.bucket(destBucketName).file(destFilename));

  console.log(
    `Generation ${generation} of file ${srcFilename} in bucket ${srcBucketName} was copied to ${destFilename} in bucket ${destBucketName}.`
  );
}

copyOldVersionOfFile().catch(console.error);

Python

Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud Storage para Python.

from google.cloud import storage

def copy_file_archived_generation(
        bucket_name, blob_name, destination_bucket_name, destination_blob_name, generation
):
    """Copies a blob from one bucket to another with a new name with the same generation."""
    # bucket_name = "your-bucket-name"
    # blob_name = "your-object-name"
    # destination_bucket_name = "destination-bucket-name"
    # destination_blob_name = "destination-object-name"
    # generation = 1579287380533984

    storage_client = storage.Client()

    source_bucket = storage_client.bucket(bucket_name)
    source_blob = source_bucket.blob(blob_name)
    destination_bucket = storage_client.bucket(destination_bucket_name)

    blob_copy = source_bucket.copy_blob(
        source_blob, destination_bucket, destination_blob_name, source_generation=generation
    )

    print(
        "Generation {} of the blob {} in bucket {} copied to blob {} in bucket {}.".format(
            source_blob.generation,
            source_blob.name,
            source_bucket.name,
            blob_copy.name,
            destination_bucket.name,
        )
    )

API de REST

API de JSON

  1. Obtén un token de autorización de acceso de OAuth 2.0 Playground. Configura Playground para usar tus propias credenciales de OAuth.
  2. Usa cURL para llamar a la API de JSON con una solicitud de objeto POST:

    curl -X POST \
      -H "Authorization: Bearer OAUTH2_TOKEN" \
      -H "Content-Length: 0" \
      "https://storage.googleapis.com/upload/storage/v1/b/SOURCE_BUCKET_NAME/o/SOURCE_OBJECT_NAME/rewriteTo/b/DESTINATION_BUCKET_NAME/o/NAME_OF_COPY?sourceGeneration=GENERATION_NUMBER"

    En el ejemplo anterior, se ilustra lo siguiente:

    • OAUTH2_TOKEN es el token de acceso que generaste en el paso 1.
    • SOURCE_BUCKET_NAME es el nombre del depósito que contiene la versión no actual que deseas copiar. Por ejemplo, my-bucket.
    • SOURCE_OBJECT_NAME es el nombre de la versión no actual que deseas copiar. Por ejemplo, pets/dog.png.
    • DESTINATION_BUCKET_NAME es el nombre del depósito en el que deseas copiar la versión no actual. Por ejemplo, my-bucket.
    • NAME OF COPY es el nombre de la copia de la versión no actual. Por ejemplo, pets/shiba.png.
    • GENERATION_NUMBER es el número de generación de la versión no actual que deseas copiar. Por ejemplo, 1560468815691234.

API de XML

  1. Obtén un token de autorización de acceso de OAuth 2.0 Playground. Configura Playground para usar tus propias credenciales de OAuth.
  2. Usa cURL para llamar a la API de XML con una solicitud de objeto PUT:

    curl -X PUT \
      -H "Authorization: Bearer OAUTH2_TOKEN" \
      -H "x-goog-copy-source: SOURCE_BUCKET_NAME/SOURCE_OBJECT_NAME" \
      -H "x-goog-copy-source-generation:GENERATION_NUMBER" \
      "https://storage.googleapis.com/DESTINATION_BUCKET_NAME/NAME_OF_COPY"

    En la que:

    • OAUTH2_TOKEN es el token de acceso que generaste en el paso 1.
    • SOURCE_BUCKET_NAME es el nombre del depósito que contiene la versión no actual que deseas copiar. Por ejemplo, my-bucket.
    • SOURCE_OBJECT_NAME es el nombre de la versión no actual que deseas copiar. Por ejemplo, pets/dog.png.
    • GENERATION_NUMBER es el número de generación de la versión no actual que deseas copiar. Por ejemplo, 1560468815691234.
    • DESTINATION_BUCKET_NAME es el nombre del depósito en el que deseas copiar la versión no actual. Por ejemplo, my-bucket.
    • NAME OF COPY es el nombre de la copia de la versión no actual. Por ejemplo, pets/shiba.png.

Borra las versiones no actuales de objetos

Para borrar una versión no actual de un objeto, haz lo siguiente:

gsutil

Usa el comando gsutil rm:

gsutil rm gs://BUCKET_NAME/OBJECT_NAME#GENERATION_NUMBER

En el que:

  • BUCKET_NAME es el nombre del depósito que contiene la versión no actual que deseas borrar. Por ejemplo, my-bucket.
  • OBJECT_NAME es el nombre de la versión no actual que deseas borrar. Por ejemplo, pets/dog.png.
  • GENERATION_NUMBER es el número de generación de la versión no actual que deseas borrar. Por ejemplo, 1560468815691234.

Si se ejecuta de forma correcta, la respuesta se ve como el siguiente ejemplo:

Operation completed over 1 objects.

Muestras de código

C++

Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud Storage para C++.

namespace gcs = google::cloud::storage;
[](gcs::Client client, std::string const& bucket_name,
   std::string const& object_name, std::int64_t object_generation) {
  google::cloud::Status status = client.DeleteObject(
      bucket_name, object_name, gcs::Generation{object_generation});
  if (!status.ok()) throw std::runtime_error(status.message());

  std::cout << "Deleted " << object_name << " generation "
            << object_generation << " in bucket " << bucket_name << "\n";
}

Java

Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud Storage para Java.

import com.google.cloud.storage.BlobId;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;

public class DeleteOldVersionOfObject {
  public static void deleteOldVersionOfObject(
      String projectId, String bucketName, String objectName, long generationToDelete) {
    // The ID of your GCP project
    // String projectId = "your-project-id";

    // The ID of your GCS bucket
    // String bucketName = "your-unique-bucket-name";

    // The ID of your GCS object
    // String objectName = "your-object-name";

    // The generation of objectName to delete
    // long generationToDelete = 1579287380533984;

    Storage storage = StorageOptions.newBuilder().setProjectId(projectId).build().getService();
    storage.delete(BlobId.of(bucketName, objectName, generationToDelete));

    System.out.println(
        "Generation "
            + generationToDelete
            + " of object "
            + objectName
            + " was deleted from "
            + bucketName);
  }
}

Node.js

Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud Storage para Node.js.

/**
 * TODO(developer): Uncomment the following lines before running the sample.
 */
// const bucketName = 'Name of a bucket, e.g. my-bucket';
// const filename = 'File to delete, e.g. file.txt';
// const generation = 'Generation of file to delete, e.g. 1';

// Imports the Google Cloud client library
const {Storage} = require('@google-cloud/storage');

// Creates a client
const storage = new Storage();

async function deleteOldVersionOfFile() {
  // Deletes the file from the bucket with given version
  await storage
    .bucket(bucketName)
    .file(filename, {
      generation,
    })
    .delete();

  console.log(
    `Generation ${generation} of file ${filename} was deleted from ${bucketName}.`
  );
}

deleteOldVersionOfFile().catch(console.error);

Python

Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud Storage para Python.

from google.cloud import storage

def delete_file_archived_generation(bucket_name, blob_name, generation):
    """Delete a blob in the bucket with the given generation."""
    # bucket_name = "your-bucket-name"
    # blob_name = "your-object-name"
    # generation = 1579287380533984

    storage_client = storage.Client()

    bucket = storage_client.get_bucket(bucket_name)
    bucket.delete_blob(blob_name, generation=generation)
    print(
        "Generation {} of blob {} was deleted from {}".format(
            generation, blob_name, bucket_name
        )
    )

API de REST

API de JSON

  1. Obtén un token de autorización de acceso de OAuth 2.0 Playground. Configura Playground para usar tus propias credenciales de OAuth.
  2. Usa cURL para llamar a la API de JSON con una solicitud de objeto DELETE:

    curl -X DELETE \
      -H "Authorization: Bearer OAUTH2_TOKEN" \
      "https://storage.googleapis.com/storage/v1/b/BUCKET_NAME/o/OBJECT_NAME?generation=GENERATION_NUMBER"

    En el ejemplo anterior, se ilustra lo siguiente:

    • OAUTH2_TOKEN es el token de acceso que generaste en el paso 1.
    • BUCKET_NAME es el nombre del depósito que contiene la versión no actual que deseas borrar. Por ejemplo, my-bucket.
    • OBJECT_NAME es el nombre de la versión no actual que deseas borrar. Por ejemplo, pets/dog.png.
    • GENERATION_NUMBER es el número de generación de la versión no actual que deseas borrar. Por ejemplo, 1560468815691234.

API de XML

  1. Obtén un token de autorización de acceso de OAuth 2.0 Playground. Configura Playground para usar tus propias credenciales de OAuth.
  2. Usa cURL para llamar a la API de XML con una solicitud de objeto DELETE:

    curl -X DELETE \
      -H "Authorization: Bearer OAUTH2_TOKEN" \
      "https://storage.googleapis.com/BUCKET_NAME/OBJECT_NAME?generation=GENERATION_NUMBER"

    En la que:

    • OAUTH2_TOKEN es el token de acceso que generaste en el paso 1.
    • BUCKET_NAME es el nombre del depósito que contiene la versión no actual que deseas borrar. Por ejemplo, my-bucket.
    • OBJECT_NAME es el nombre de la versión no actual que deseas borrar. Por ejemplo, pets/dog.png.
    • GENERATION_NUMBER es el número de generación de la versión no actual que deseas borrar. Por ejemplo, 1560468815691234.

Próximos pasos